【问题标题】:How to select random number如何选择随机数
【发布时间】:2012-10-07 23:17:24
【问题描述】:

我需要在 (-15, 15) 内的 C# 中获取一个随机数,但不生成 (-10, 10) 之间的值作为浮点数。就像随机应该在(-15,-10)(10,15) 中一样。

有可能得到吗?

【问题讨论】:

  • 试错,generate a number 看看它是否在范围内。
  • 生成你的号码,检查它是否在-10和10之间。如果是,再做一次。
  • 或者在每个范围内生成一个随机数,然后随机选择一个。
  • 其实我以为是 Random.Range (-15,15) 但它也会在 (-10,10) 中生成,如何避免
  • @psubsee2003 这不会给他们同等的权重。如果一个范围较大,则该范围内的数字比另一个范围内的数字更不可能。

标签: c# random numbers


【解决方案1】:

这可以在一行中完成,但为了清楚起见,我将其分开。

public double GetRandomNumber()
{ 
    //Between 0 and 1
    Random random = new Random();
    double randomNumber = random.NextDouble();

    //Between -0.5 and 0.5;
    randomNumber -= 0.5;

    //Between -5.0 and 5.0;
    randomNumber *= 10.0;

    //Between [-15.0, -10.0] or [10.0, 15.0]
    randomNumber += Math.Sign(randomNumber) * 10.0;

    return randomNumber;
}

【讨论】:

  • 感谢您的精彩回答... :-)
【解决方案2】:

一种方法是使用这个:

var random = new Random();

var result = random.NextDouble();
if(result < 0.5)
    result = -15 + result * 10;
else
    result = 5 + result * 10;

Random.NextDouble 生成一个介于 0.0 和 1.0 之间的数字。
如果小于 0.5,我们将其视为创建负数的指标。

【讨论】:

  • 这只是有效的答案,但是我会将 new Random() 放在任何循环之外......
  • @DanielMošmondor:当然。但对于System.Random 的每次使用都是如此。
  • @HenkHolterman:不。在那个分支中,result 介于 0.5 和 1.0 之间。您的更改将导致范围内的数字 [15; 20] 而不是 [10; 15].
  • @Daniel Hilgarth : 非常感谢你的回答... :-) 你的回答也是正确的...有没有机会勾选两个正确的答案 :-)
  • @user1753810:不客气。不可能将多个答案标记为已接受。只需选择对您最有帮助的一项即可。
【解决方案3】:

另一种方法,假设您确实希望结果中有小数位(因为它并不完全清楚)。

Random rand = new Random();
var intValue = rand.Next(10,15);
var decimalValue = rand.NextDouble();
var sign = rand.Next(0,1);
if (sign == 0) sign = -1;
return (intValue + decimalValue) * sign;

【讨论】:

  • +1 接近我打算做的,并增加了一层额外的随机性
【解决方案4】:

生成两个随机数。第一个随机数将选择您是在 -15 到 -10 范围内,还是在 10 到 15 范围内,第二个 - 您希望在该范围内走多远。

【讨论】:

  • 请注意,这仅适用于数字范围相同大小的情况。如果一个范围大于另一个范围,则每个数字的概率不相等。
【解决方案5】:

试试:

Random random = new Random();
float value = (float) (Math.Sign((random.NextDouble() - 1)) * (10 + 5 * random.NextDouble()));

【讨论】:

    【解决方案6】:
        static Random r = new Random(2);
    
        static void Main(string[] args)
        {
    
            int d = r.Next(-15, 15);
            while ((d >= -15 && d <= -10) || (d >= 10 && d <= 15))
                Console.WriteLine(d);
            Console.ReadLine();
        }
    

    【讨论】:

      【解决方案7】:

      如果您想要整数并且希望它具有高性能,我会使用:

      var rand = new Random();
      int value = rand.Next(-5, 7);
      return value > 0 ? value + 9 : value - 10;
      

      我假设您需要以下范围内的数字:[-15, -10] 和 [10, -15]。适当调整上面的硬编码值。为了提高性能,可能有一种方法可以进行一些算术运算并避免比较,但我会将其留给 cmets。

      【讨论】:

      • 如果你不想要整数,那么 TylerOhlsen 有正确的答案。
      【解决方案8】:

      这里有一个静态方法来实现:

      public static int RandomRange(int min, int max, bool includeNegatives = false)
      {
          if( min >= max) throw new Exception("min can't be greater than max");
          Random rdm = new Random();
          int num = 0;
          while (num < min) num = rdm.Next(max + 1);
          return num * (rdm.Next() % 2 == 0 ? -1 : 1);
      }
      

      称呼它:

      var TenToFifteenNegatives = RandomRange(10, 15, true);
      var TenToFifteenNoNegatives = RandomRange(10, 15);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-29
        • 1970-01-01
        • 2022-09-30
        相关资源
        最近更新 更多