我使用此代码生成随机数。
Random R = new Random(0);
int Rand = R.Next(7);
但我在每个程序运行中得到相同的随机数。
答案 0 :(得分:13)
从构造函数中删除0,你会得到不同的随机数。
如果您将一个数字传递给构造函数,它将用作种子,通过始终指定0,您将始终获得相同的序列。
你可以指定一个随机的int32,但最简单的是不传递任何参数,你得到一个基于时间的种子
答案 1 :(得分:10)
每次运行程序时都必须更改随机数生成器对象的种子,就像我从你看到的那样,你当前的种子是0,所以如果你想要你必须将它改成别的东西得到一个不同的随机数流...只是一个想法!
答案 2 :(得分:3)
使用非常数值对您的(伪) - 随机生成器进行种子处理,例如:当前时间和日期:
Random R = new Random(DateTime.Now.Ticks);
答案 3 :(得分:0)
将时间用作PRNG的初始种子。
答案 4 :(得分:0)
你需要使用比0更多的变量为Random类播种。我通常使用DataTime.Now.Ticks,或者你可以使用新的Guid的整数值。
答案 5 :(得分:0)
您需要为随机生成器播种。您可以按如下方式使用:
Random R = new Random(DateTime.Now.Millisecond);
int Rand = R.Next(7);
答案 6 :(得分:0)
随机数生成器根据生成的先前数生成新的“随机”值。种子是这个的初始值。
使用相同的值(在示例代码中为0)播种基本上告诉随机数生成器每次都以相同的数字开头。每次生成完全相同的随机数意味着您的代码可以重新启动。示例:模拟使用此方法重新启动带有更改参数的模拟,但使用相同的“数据集”。
另一个例子:
我想每天向自己发送一条激励信息。有时消息会出现乱码。能够重新运行脚本,在一天中一次又一次地生成相同的消息,使得修复这个简单。在Perl代码中,这意味着:
# By initialising the random generator with the day number since
# the epoch, we get the same quote during one day.
srand(time()/(24*3600));
my $i = int(rand(@messages));
如果您想每次生成不同的数字,则必须将此种子设置为随机的。选项很多,如时间,PID,用户两次击键之间的延迟,某些值来自以太网接口等,或者更可能是上述组合time*PID
。
希望这可以澄清随机数种子值概念背后的想法。
答案 7 :(得分:0)
如果我们想要1到100之间的随机数,代码将如下所示: RandomNumberGenerator.GetRandomInt(1,100)
答案 8 :(得分:0)
生成随机数的最安全方法是使用System.Security.Cryptography.RandomNumberGenerator类。
以下是一个生成介于1和100之间的数字的示例;
public Number Rand()
{
byte[] Salt = new byte[8];
System.Security.Cryptography.RandomNumberGenerator.Create().GetBytes(Salt);
decimal result = 0;
foreach (byte b in Salt)
{
result = result * 255 + b;
}
while (result > 100)
{
result /= 10;
}
return result
}
答案 9 :(得分:0)
完整代码:
public static class RandomHelper
{
static object _myLock = new object();
static Random _random = new Random();
public static int RandomNumber(int min, int max)
{
lock (_myLock)
{
if (min == max)
return min;
if (min > max)
return _random.Next(max, min);
return _random.Next(min, max);
}
}