c - 生成范围 [l u] 内的随机数

标签 c random

<分区>

Possible Duplicate:
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);

谢谢,

最佳答案

使用 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)

关于c - 生成范围 [l u] 内的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12807459/

相关文章:

c# - 具有定义路径大小的随机路径生成算法

java - 改进数独的随机数生成器

algorithm - 加权随机映射

Ctrl + C 处理程序在某些主机上工作而不在其他主机上工作

c - 用随机点填充平面

c - printf 中的尾数值略有偏差

c++ - 查看是否可以使用堆栈从左侧和右侧以相同的方式读取字符串

c - 如何从 C 中的递归函数内部添加到字符串数组

python - Python中给定PDF的随机数

php - MySQL随机选择