c - 如何从 C 中的整个 int 范围生成随机数?

标签 c random

unsigned const number = minimum + (rand() % (maximum - minimum + 1))

我知道如何(轻松地)生成一个范围内的随机数,例如从 0 到 100。但是 int完整范围中的随机数呢? (假设 sizeof(int) == 4),即从 INT_MININT_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/

相关文章:

c - 随机化数组中的结果

python - 随机数生成 python 3.x 默认库

c - 在C中编辑某个字符后的文件

c - 允许什么分配返回值?

c - `#define LT(n) n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n`在这里做什么?

比较C中的两个矩阵

c - 为什么在 c 中使用 rand() 时每个子进程都生成相同的 "random"数字?

c++ - SDL,随机颜色发生器

C - 读()和写()

c - C 中的 IUP - 教程无法编译