我在Microsoft Visual C#2008 Express中工作.
我找到了这段代码:
public static int RandomNumber(int min, int max)
{
Random random = new Random();
return random.Next(min, max);
}
Run Code Online (Sandbox Code Playgroud)
问题是我运行了100多次,当我的min = 0和max = 1时,它总是给我相同的答案.我每次都得到0.(我创建了一个测试函数来运行它 - 真的 - 我每次都得到0).我很难相信这是巧合...我还能做些什么来检查或测试这个?(我确实重新进行了测试,min = 0和max = 10,前50次,结果总是"5",第二次50次,结果总是"9".
?? 我需要一些更随意随意的东西......
-Adeena
mat*_*sza 32
random = new Random();
Run Code Online (Sandbox Code Playgroud)
这将启动具有当前时间(以秒为单位)的随机数生成器.在系统时钟更改之前多次调用函数时,随机数生成器将以相同的值启动,因此它返回相同的值序列.
Eri*_*ric 18
不要为Next创建包装器方法.它浪费了创建Random类的新实例的循环.只需使用同一个!
Random myRand = new Random();
for(int i = 0; i < 10; i++)
{
Console.WriteLine(myRand.Next(0, 10).ToString());
}
Run Code Online (Sandbox Code Playgroud)
这应该给你十个随机值.
如前所述 - Random是伪随机的(如同所有实现一样),如果您使用相同的种子创建100个实例,您将获得100个相同结果的实例.确保你重复使用课程.
此外,正如人们所说,请注意MinValue是包容性的,MaxValue是独家的.根据你的需要,做myRand.Next(0,2).
Next()的重载返回:
大于或等于minValue且小于maxValue的32位有符号整数; 也就是说,返回值的范围包括minValue但不包括MaxValue.如果minValue等于maxValue,则返回minValue.
0是唯一可能返回的值.也许你想要random.NextDouble(),它将在0和1之间返回一个double.
你总是得到0因为Random.Next返回整数.你需要调用Random.NextDouble,它将返回0到1之间的数字.另外,你应该重用你的Random实例,如下所示:
[ThreadStatic]
static Random random;
public static Random Random {
get {
if (random == null) random = new Random();
return random;
}
}
public static int RandomInteger(int min, int max)
{
return Random.Next(min, max);
}
public static double RandomDouble() //Between 0 and 1
{
return Random.NextDouble();
}
Run Code Online (Sandbox Code Playgroud)
如果您想要加密安全的随机数,请使用RNGCryptoServiceProvider该类; 看到这篇文章
编辑:线程安全