【问题标题】:generate random number in a range [l u] [duplicate]生成范围内的随机数 [l u] [重复]
【发布时间】:2012-09-30 05:20:49
【问题描述】:

可能重复:
How to generate a random number from within a range - C

我从programming pearls看到了以下代码

int randint(int l, int u)
{   return l + (RAND_MAX*rand() + rand()) % (u-l+1);
}

谁能帮我解释一下?

我们可以用吗

return l + rand() % (u-l+1);

谢谢,

【问题讨论】:

  • quicksort 跟这个问题有什么关系?
  • @millimoose,最好先做"swap(l, randint(l, u))" 进行预处理
  • @FihopZz 所以?您不是在询问快速排序算法本身,因此它充其量只是切线相关。
  • @millimoose,是的,你是对的。

标签: c random


【解决方案1】:

是的,没关系,检查 u>l,你只能这样做:

return l + (RAND_MAX*rand()) % (u-l+1);

解释:

如果我们想在联合分布中在[0,N] 中生成一个随机整数,当N>0 时,我们会使用:

 return (RAND_MAX*rand()) % (N+1);

由于在您的情况下该范围被固定值 l 所破坏,因此我们只需将其添加到最终结果中即可。

python 模型:

>>> import random
>>> import sys
>>> for i in xrange(20):
    int(random.random()*sys.maxint%4)


0
1
2
3
1
1
2
2
3
0
3
3
0
2
3
3
1
2
2
3

【讨论】:

    【解决方案2】:

    使用rand() % n 获得介于 0 和 n-1 之间的数字的问题在于,当 n 不是 RAND_MAX 的精确除数时,它会有一些偏差。 n 的值越高,这种偏差就越强。

    为了说明为什么会发生这种情况,让我们假设 rand() 将使用六面骰子来实现。所以 RAND_MAX 会是 5。我们想用这个骰子生成 0 到 3 之间的随机数,所以我们这样做:

    x = rand() % 4
    

    对于 rand 的六个结果中的每一个,x 的值是多少?

    0 % 4 = 0
    1 % 4 = 1
    2 % 4 = 2
    3 % 4 = 3
    4 % 4 = 0
    5 % 4 = 1
    

    如您所见,数字 0 和 1 的生成频率是数字 2 和 3 的两倍。

    当您的用例不允许偏差时,这是计算随机数的更好方法:

     (int)((double)rand() / (double)RAND_MAX * (double)n)
    

    【讨论】:

    • 顺便说一句:这也是许多现代语言中最简单的随机数生成器默认返回介于 0.0(含)和 1.0(不含)之间的浮点值的原因:将这些转换为 0 到 n 之间的整数是无偏差的。
    • @Philipp 不同意“将这些转换为 0 和 n 之间的整数的直接方法是无偏差的”。通过“直截了当的方式”,我假设您的意思是int y = rand_0to1() * n。考虑rand_0to1() 生成M 不同的值。除非M%n == 0,否则会有偏见,虽然很小。
    • 当然你想要(int)((double)rand() / (RAND_MAX + 1.0)* (double)n)。这和原版可能会更好,但对任意n 没有偏见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 2011-03-01
    • 2015-06-05
    相关资源
    最近更新 更多