-1

I have a problem with a random function.

I am trying to create a string with 10 random letters/numbers.

However when I run the function, I get the same string 10 times in a row. What does that depend on and how can I truly create a random string in this case?

void testfunction()
{
    for (int i = 0; i < 10; i++)
    {
        String randomname = getRandomLetterNumbers(10);
        listBox1.Items.Add(randomname);
    }
}
public String getRandomLetterNumbers(int nrLetterNumbers)
{
    String letters = "abcdefghijklmnopqrstuvwxyz0123456789";
    Random random = new Random(); String str = ""; int rand = 0;
    for (int i = 0; i < nrLetterNumbers; i++)
    {
        rand = random.Next(0, letters.Length);
        str = str + letters.Substring(rand, 1);
    }
    return str;
}
Jon Skeet
  • 1,421,763
  • 867
  • 9,128
  • 9,194
Andreas
  • 1,121
  • 4
  • 17
  • 34

1 Answers1

0

You need to move the random instantiation at class level else you got the same randoms (see duplicates for explanation).

Also you don't need to call substring, you can use char indexer.

private Random random = new Random();

public String getRandomLetterNumbers(int nrLetterNumbers)
{
  String letters = "abcdefghijklmnopqrstuvwxyz0123456789";
  String str = ""; 
  int rand = 0;
  for ( int i = 0; i < nrLetterNumbers; i++ )
  {
    rand = random.Next(0, letters.Length);
    str = str + letters[rand];
  }
  return str;
}

Result:

l7jvgw77rf
e8h6i6bg1q
2jz8alaf7q
2k1rh5byqo
esgcmdy0f5
sjmhvbilu4
v29bm4gzym
4nznljdwv7
xk9c8s7u6f
wzev2msf0s

If you plan to generate long strings several times you may use StringBuilder instead of string concatenation, that avoids the copy of strings items each time you add a char:

using System.Text;

private string letters = "abcdefghijklmnopqrstuvwxyz0123456789";

public string GetRandomLetterNumbers(int nrLetterNumbers)
{
  var builder = new StringBuilder(nrLetterNumbers);
  for ( int i = 0; i < nrLetterNumbers; i++ )
  {
    builder.Append(letters[random.Next(0, letters.Length)]);
  }
  return builder.ToString();
}