【问题标题】:Produce a random number in a range using C#使用 C# 在一个范围内产生一个随机数
【发布时间】:2011-04-27 21:06:27
【问题描述】:

如何在一个范围内产生随机数?

【问题讨论】:

    标签: c# .net random


    【解决方案1】:

    你可以试试

    Random r = new Random();
    int rInt = r.Next(0, 100); //for ints
    int range = 100;
    double rDouble = r.NextDouble()* range; //for doubles
    

    看看

    Random ClassRandom.Next Method (Int32, Int32)Random.NextDouble Method

    【讨论】:

    • 只是添加一个注释,如果您使用 NextDouble() 并且不希望下限为零。你乘以上限和下限之间的差,然后加上下限和零之间的差。所以对于 -1 到 1 double rDouble = (r.NextDouble()*2)-1.0;
    • 或-1.0和1.0范围内的简化双生成器:Double randDoubleY = new Random().Next(-100, 100) / 100.0D;
    • Random() 使用与时间相关的种子,但明确地写出它更便于阅读。
    • System.Random 不是随机的!
    • @cskwg 计算机生成的任何东西都不是随机的
    【解决方案2】:

    试试下面的代码。

    Random rnd = new Random();
    int month = rnd.Next(1, 13); // creates a number between 1 and 12
    int dice = rnd.Next(1, 7); // creates a number between 1 and 6
    int card = rnd.Next(52); // creates a number between 0 and 51
    

    【讨论】:

      【解决方案3】:

      类似:

      var rnd = new Random(DateTime.Now.Millisecond);
      int ticks = rnd.Next(0, 3000);
      

      【讨论】:

      • DateTime.Now.Millisecond 是什么?
      • 您需要为其添加一些内容...... Random 对象只是对您给出的值进行大量数学运算,并且每次调用 Next( ) 在同一个 Random 对象上 将产生一个与前一次调用完全随机的值。为了使结果在不同的 Random 对象 中更加随机,您可以从不同的数字开始——这里是 DateTime.Now.Millisecond。如果你输入一个常数,而不是一个变化的值,你会从 .Next() 得到相同的结果。
      • Random 已经植入了系统值,而Millisecond 只是一个介于 0 和 999 之间的数字。如果这对行在代码中始终在一起,则可能只有 1000 个值的rnd.Next,因为每次都会重置种子。输入相同的种子,输出相同的随机数。我会把手动种子放在外面。
      • @JohnMcDonald,你是对的。准确地说,它是用Environment.TickCount初始化的。
      • 谢谢,成功了!我是这样写的: var rnd = new Random(DateTime.Now.Millisecond + i);在循环中,“i”是循环中的增量。
      【解决方案4】:

      用途:

      Random r = new Random();
       int x= r.Next(10);//Max range
      

      【讨论】:

      • 这没有指定范围。
      • 你只需执行 lower_value + r.Next(10) 即可获得随机范围。
      【解决方案5】:

      对于未来的读者,如果您想要一个范围内的随机数,请使用以下代码:

      public double GetRandomNumberInRange(double minNumber, double maxNumber)
      {
          return new Random().NextDouble() * (maxNumber - minNumber) + minNumber;
      }
      

      C# Random double between min and max

      Code sample

      【讨论】:

      • 公式应为:return new Random().NextDouble() * (maxNumber - minNumber) + minNumber;
      • 永远不要这样做。不要每次都创建一个 Random 实例。随着时间的推移重复使用时,总是重用一个 Random 实例。我已经看到类似上面的代码在调试时工作得很好(即:缓慢),但在生产中运行时会产生相同的随机数(即:全速)。当时是因为在同一时刻创建了两个 Random() 实例,它们都产生了相同的随机数。可以将其想象为 Random 正在由当前时间播种,因此如果足够接近,它们将具有相同的种子,并产生相同的数字。不要拔头发。重复使用你的新随机数。
      • @AAron,说得好。认为读者需要知道这一点。将 Random 添加到类变量或传入现有实例是一个好主意,以便可以重用它。特别是如果您需要在同一时刻多次完成它。这完全取决于你想在哪里使用这段代码以及它会被执行多少次。
      【解决方案6】:

      这里是Darrelk answer 的更新版本。 它是使用C# extension methods 实现的。 每次调用此方法时,它都不分配内存new Random())。

      public static class RandomExtensionMethods
      {
          public static double NextDoubleRange(this System.Random random, double minNumber, double maxNumber)
          {
              return random.NextDouble() * (maxNumber - minNumber) + minNumber;
          }
      }
      

      用法(确保导入包含 RandomExtensionMethods 类的命名空间):

      var random = new System.Random();
      double rx = random.NextDoubleRange(0.0, 1.0);
      double ry = random.NextDoubleRange(0.0f, 1.0f);
      double vx = random.NextDoubleRange(-0.005f, 0.005f);
      double vy = random.NextDoubleRange(-0.005f, 0.005f);
      

      【讨论】:

        【解决方案7】:

        除了生成整数和双精度数的Random Class 之外,请考虑:

        【讨论】:

          猜你喜欢
          • 2018-04-08
          • 1970-01-01
          • 2011-08-02
          • 1970-01-01
          • 1970-01-01
          • 2013-08-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多