gpt4 book ai didi

c - 如何在 C 中生成随机 64 位无符号整数

转载 作者:太空狗 更新时间:2023-10-29 16:41:31 24 4
gpt4 key购买 nike

我需要使用 C 生成随机 64 位无符号整数。我的意思是,范围应该是 018446744073709551615RAND_MAX1073741823

我在链接中找到了一些可能重复的解决方案,但答案主要是连接一些 rand() 结果或进行一些增量算术运算。所以结果总是 18 位或 20 位。我还想要像 51133387 这样的结果,而不仅仅是 3771778641802345472

顺便说一句,我真的没有太多 C 的经验,但任何方法、代码示例和想法都可能是有益的。

最佳答案

关于“所以结果总是 18 位或 20 位。”

参见 @Thomas comment .如果您生成的随机数足够长,代码将创建类似 5、11 和 33387 的随机数。如果代码每秒生成 1,000,000,000 个数字,则可能需要一年时间,因为非常小的数字 < 100,000 在所有 64 位数字中非常罕见。


rand() 简单返回随机位。一个简单的方法一次拉取一位

uint64_t rand_uint64_slow(void) {
uint64_t r = 0;
for (int i=0; i<64; i++) {
r = r*2 + rand()%2;
}
return r;
}

假设 RAND_MAX 是 2 - 1 的某个幂,如 OP 的情况 1073741823 == 0x3FFFFFFF,利用 30 at每次至少生成 15 位。以下代码将调用 rand() 5 3 次 - 有点浪费。相反,可以为下一个随机数保存移出的位,但这会带来其他问题。改天再说。

uint64_t rand_uint64(void) {
uint64_t r = 0;
for (int i=0; i<64; i += 15 /*30*/) {
r = r*((uint64_t)RAND_MAX + 1) + rand();
}
return r;
}

可移植循环计数方法避免了 15/*30*/ - 但请参阅下面的 2020 年编辑

#if RAND_MAX/256 >= 0xFFFFFFFFFFFFFF
#define LOOP_COUNT 1
#elif RAND_MAX/256 >= 0xFFFFFF
#define LOOP_COUNT 2
#elif RAND_MAX/256 >= 0x3FFFF
#define LOOP_COUNT 3
#elif RAND_MAX/256 >= 0x1FF
#define LOOP_COUNT 4
#else
#define LOOP_COUNT 5
#endif

uint64_t rand_uint64(void) {
uint64_t r = 0;
for (int i=LOOP_COUNT; i > 0; i--) {
r = r*(RAND_MAX + (uint64_t)1) + rand();
}
return r;
}

自相关效应评论here由弱 rand() 引起。 C 没有指定特定的随机数生成方法。以上依赖于 rand() - 或任何使用的基本随机函数 - 是好的。

如果 rand() 低于标准,则代码应使用其他生成器。然而,人们仍然可以使用这种方法来建立更大的随机数。


[编辑 2020]

Hallvard B. FurusethRAND_MAXMersenne Number 时,它提供了确定位数的好方法- 2 减 1 的幂。

#define IMAX_BITS(m) ((m)/((m)%255+1) / 255%255*8 + 7-86/((m)%255+12))
#define RAND_MAX_WIDTH IMAX_BITS(RAND_MAX)
_Static_assert((RAND_MAX & (RAND_MAX + 1u)) == 0, "RAND_MAX not a Mersenne number");

uint64_t rand64(void) {
uint64_t r = 0;
for (int i = 0; i < 64; i += RAND_MAX_WIDTH) {
r <<= RAND_MAX_WIDTH;
r ^= (unsigned) rand();
}
return r;
}

关于c - 如何在 C 中生成随机 64 位无符号整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33010010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com