unsigned const number = minimum + (rand() % (maximum - minimum + 1))
我知道如何(轻松地)生成一个范围内的随机数,例如从 0 到 100。但是 int
的完整范围中的随机数呢? (假设 sizeof(int) == 4
),即从 INT_MIN
到 INT_MAX
,包括两者?
我不需要密码学之类的东西,但大致均匀分布会很好,我需要很多这样的数字。
我目前使用的方法是生成 0 到 255(含)范围内的 4 个随机数,并进行一些困惑的转换和位操作。我想知道是否有更好的方法。
最佳答案
在我的系统上,RAND_MAX
是 32767,即 15 位。所以对于 32 位 unsigned
只需调用 3 次并移位,或者,掩码等。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void){
unsigned rando, i;
srand((unsigned)time(NULL));
for (i = 0; i < 3; i++) {
rando = ((unsigned)rand() << 17) | ((unsigned)rand() << 2) | ((unsigned)rand() & 3);
printf("%u\n", rando);
}
return 0;
}
程序输出:
3294784390
3748022412
4088204778
关于c - 如何从 C 中的整个 int 范围生成随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35490210/