创建一个与之前的程序运行不同的随机int数

时间:2010-03-03 09:02:25

标签: c# random

我使用此代码生成随机数。

 Random R = new Random(0);
 int Rand = R.Next(7);

但我在每个程序运行中得到相同的随机数。

10 个答案:

答案 0 :(得分:13)

从构造函数中删除0,你会得到不同的随机数。

如果您将一个数字传递给构造函数,它将用作种子,通过始终指定0,您将始终获得相同的序列。

你可以指定一个随机的int32,但最简单的是不传递任何参数,你得到一个基于时间的种子

答案 1 :(得分:10)

每次运行程序时都必须更改随机数生成器对象的种子,就像我从你看到的那样,你当前的种子是0,所以如果你想要你必须将它改成别的东西得到一个不同的随机数流...只是一个想法!

答案 2 :(得分:3)

使用非常数值对您的(伪) - 随机生成器进行种子处理,例如:当前时间和日期:

Random R = new Random(DateTime.Now.Ticks);

详细了解pseudo-random generators at Wikipedia

答案 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);
        }

}