随机串生成器返回相同的字符串
这个问题在这里已经有了答案:
你在方法中创建了Random实例,这使得它在快速连续调用时返回相同的值。 我会做这样的事情:
private static Random random = new Random((int)DateTime.Now.Ticks);//thanks to McAden
private string RandomString(int size)
{
StringBuilder builder = new StringBuilder();
char ch;
for (int i = 0; i < size; i++)
{
ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
builder.Append(ch);
}
return builder.ToString();
}
// get 1st random string
string Rand1 = RandomString(4);
// get 2nd random string
string Rand2 = RandomString(4);
// creat full rand string
string docNum = Rand1 + "-" + Rand2;
(你的代码的修改版本)
你正在实例化方法中的Random
对象。
Random
对象从系统时钟开始播种,这意味着如果您连续多次调用您的方法,它将每次使用相同的种子,这意味着它会生成相同的随机数序列,这意味着你会得到相同的字符串。
为了解决这个问题,将你的Random
实例移动到方法本身之外(并且当你在它的时候,你可以摆脱对Convert
和Floor
和NextDouble
疯狂的调用序列):
private readonly Random _rng = new Random();
private const string _chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private string RandomString(int size)
{
char[] buffer = new char[size];
for (int i = 0; i < size; i++)
{
buffer[i] = _chars[_rng.Next(_chars.Length)];
}
return new string(buffer);
}
//非常简单的实现
using System.IO;
public static string RandomStr()
{
string rStr = Path.GetRandomFileName();
rStr = rStr.Replace(".", ""); // For Removing the .
return rStr;
}
//现在只需调用RandomStr()方法
链接地址: http://www.djcxy.com/p/17715.html