【问题标题】:Create a random int number that differ from previous run of program创建一个与先前运行的程序不同的随机 int 数
【发布时间】:2010-03-03 09:02:25
【问题描述】:

我用这段代码生成一个随机数。

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

但我每次运行程序都会得到相同的随机数。

【问题讨论】:

  • 播种你的随机数生成器
  • 这是一个特性,而不是一个错误 :)
  • 附注:在大多数 PRNG 中最好避免使用 0 的种子。一些实现可以解决它,但你不应该依赖它。

标签: c# random


【解决方案1】:

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

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

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

【讨论】:

  • +1 是唯一提出显而易见的建议的人;使用无参数构造函数。
【解决方案2】:

每次运行程序时,您都必须更改随机数生成器对象的种子,正如我从您的示例中看到的那样,您当前的种子为 0,因此如果您愿意,您必须将其更改为其他内容得到一个不同的随机数流......只是一个想法!

【讨论】:

    【解决方案3】:

    使用非常量值播种(伪)随机生成器,例如当前时间和日期:

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

    阅读更多关于pseudo-random generators at Wikipedia的信息。

    【讨论】:

    【解决方案4】:

    将时间用作 PRNG 的初始种子。

    【讨论】:

      【解决方案5】:

      您需要为随机生成器播种。可以如下使用:

      随机 R = new Random(DateTime.Now.Millisecond);

      int Rand = R.Next(7);

      【讨论】:

        【解决方案6】:

        随机数生成器根据之前生成的数字生成一个新的“随机”值。种子是这个的初始值。

        使用相同值(如示例代码中的 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】:

          如果我们想要一个 1 到 100 之间的随机数,代码如下所示: RandomNumberGenerator.GetRandomInt(1, 100)

          【讨论】:

            【解决方案8】:

            生成随机数最安全的方法是使用 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】:

              完整代码:

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

              【讨论】:

                【解决方案10】:

                您需要使用比 0 更多的变量来为 Random 类播种。我通常使用 DataTime.Now.Ticks 或者您可以使用新的 Guid 的整数值。

                【讨论】:

                  猜你喜欢
                  • 2016-04-12
                  • 1970-01-01
                  • 2011-12-29
                  • 2019-05-31
                  • 2013-10-20
                  • 1970-01-01
                  • 2013-10-30
                  • 1970-01-01
                  • 2022-11-16
                  相关资源
                  最近更新 更多