【问题标题】:How to generate random number within range (-x,x)如何生成范围内的随机数(-x,x)
【发布时间】:2011-02-26 19:04:41
【问题描述】:

嗨 可以使用 rand()?? 生成范围 (-x,x) 内的随机数?如果没有,如何生成该范围内的随机数?

【问题讨论】:

标签: c++ random


【解决方案1】:
// return a random number between 0 and limit inclusive.
int rand_lim(int limit) {

    int divisor = RAND_MAX/(limit+1);
    int retval;

    do { 
        retval = rand() / divisor;
    } while (retval > limit);

    return retval;
}

// Return a random number between lower and upper inclusive.
int rand_lim(int lower, int upper) {
    int range = abs(upper-lower);

    return rand_lim(range) + lower;
}

像往常一样,我在这个帖子中看到的所有其他人都可以/将会产生至少稍微偏斜的结果。

【讨论】:

  • 唉,这也可能会返回偏斜的结果,尽管可能不会很多。如果RAND_MAX%(limit+1) < limit,则优先使用第一个RAND_MAX%(limit+1) 号码。
  • 加入 skewed 位。假设rand()[0..15] 中生成一个完美均匀的整数,假设我们要在[-3..3] 之间生成一个随机整数。通常的操作包括将[0..15]折叠[-3..3]上:[0..6][7..13]完美地映射到[-3..3](即,当rand()返回18时,我们输出-2)... 但是当rand() 返回1415 时会发生什么?如果我们将它们分别映射到-3-2,那么我们就有一个偏态 分布,因为它比任何其他数字都更有可能得到-3-2
【解决方案2】:

我只是一个简单的 Basic 程序员,但我觉得我没有抓住重点。答案似乎很简单。请原谅VB代码

    Dim prng As New Random
    Const numEach As Integer = 100000
    Const x As Integer = 3 'generate random number within a range (-x,x) inclusive

    Dim lngth As Integer = Math.Abs(-x - x) + 1
    Dim foo(lngth - 1) As Integer 'accumualte hits here

    For z As Integer = 1 To (numEach * lngth)
        Dim n As Integer = prng.Next(lngth) 'generate number in inclusive range
        foo(n) += 1 'count it
        'n = x - n 'actual n
    Next

    Debug.WriteLine("Results")
    For z As Integer = 0 To foo.Length - 1
        Debug.WriteLine((z - x).ToString & " " & foo(z).ToString & " " & (foo(z) / numEach).ToString("n3"))
    Next
    Debug.WriteLine("")

典型结果

Results
-3 99481 0.995
-2 100214 1.002
-1 100013 1.000
0 100361 1.004
1 99949 0.999
2 99755 0.998
3 100227 1.002


Results
-3 100153 1.002
-2 99917 0.999
-1 99487 0.995
0 100383 1.004
1 100177 1.002
2 99808 0.998
3 100075 1.001

【讨论】:

    【解决方案3】:

    查看this question的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-24
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-31
      • 1970-01-01
      • 2014-01-29
      相关资源
      最近更新 更多