I need to create a block of unique lines to test a different project I am working on.
So I created a simple program to generate a random string of X length.
The issue is that if I call it once, I get a random string, if I call it again (in a for loop for example) I get the same string for the entire execution of the loop.
I have a feeling that it’s being cached or something but I didn’t know .net did that and I am just confused at this point.
calling code:
StreamWriter SW = new StreamWriter("c:\\test.txt");
int x = 100;
while (x >0)
{
SW.WriteLine(RandomString(20));
x--;
}
here is the method:
private static string RandomString(int Length)
{
StringBuilder sb = new StringBuilder();
Random randomNumber = new Random();
for (int i = 0; i <= Length; ++i)
{
int x = randomNumber.Next(65, 122);
sb.Append(Convert.ToChar(x));
}
return sb.ToString();
}
and here is the output:
"VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
..................
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB"
So what gives i thought Random.next() would always return a new random number?
You are creating the
Randominstances too close in time. Each instance is initialised using the system clock, and as the clock haven’t changed you get the same sequence of random numbers over and over.Create a single instance of the
Randomclass and use it over and over.Use the
usingkeyword so that theStreamWriteris closed and disposed when you are done with it. The code for a loop is easier to recognise if you use theforkeyword.The method takes the
Randomobject as a parameter.Also, use the length to initialise the StringBuilder with the correct capacity, so that it doesn’t have to reallocate during the loop. Use the < operator instead of <= in the loop, otherwise you will create a string that is one character longer than the
lengthparameter specifies.