在C/C++中获取大的随机数

For*_*Bru 8 c c++ random unsigned-long-long-int

标准rand()功能给我的数字不够大:我需要unsigned long long的.我们如何获得非常大的随机数?我尝试修改一个简单的哈希函数,但它太大,运行时间太长,从不产生小于1e5的数字!!

Bau*_*gen 16

您可以轻松地执行此操作std::uniform_int_distribution<unsigned long long>.

简单示例代码(取自此处,修改后使用unsigned long long):

#include <random>
#include <iostream>

int main()
{
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<unsigned long long> dis(lowerBorder, upperBorder);

    for (int n=0; n<10; ++n)
        std::cout << dis(gen) << ' ';
    std::cout << '\n';
}
Run Code Online (Sandbox Code Playgroud)

请注意,这里为了演示目的而进行的mersenne twister播种并不完美,例如请参见此处.


nwe*_*hof 8

这是一个便携式C99解决方案,它返回一个随机的64位数字:

unsigned long long llrand() {
    unsigned long long r = 0;

    for (int i = 0; i < 5; ++i) {
        r = (r << 15) | (rand() & 0x7FFF);
    }

    return r & 0xFFFFFFFFFFFFFFFFULL;
}
Run Code Online (Sandbox Code Playgroud)

说明:rand()返回0到0范围内的整数,RAND_MAX并且RAND_MAX仅保证至少为32,767(15个随机位).long long保证有64位但可能更大.

  • 真的很厌倦这个.这似乎是合理的,但它产生的数字可能不会(实际上,可能不会)通过许多随机性的统计测试. (4认同)
  • @LưuVĩnhPhúcMSVC(具有合理的市场份额)有`#define RAND_MAX 0x7fff` (2认同)
  • @NikBougalis 仍然没有看到问题;假设 rand() 是均匀分布的,没有看到任何无法生成的数字或任何会或多或少生成的数字。话虽如此,针对 dieharder 3.31.1 运行此程序;有两个“良好”的测试结果很弱[没有失败](而不是仅仅使用 rand() 的输出,后者有很多失败,大概是由于 rand() 一次不返回 32 位随机性,或者uchar x = rand() % 256 并一次输出 8 位;只有 1 个可疑测试返回较弱(其余通过) (2认同)