生成随机64位整数

dat*_*ili 6 c++ random 64-bit

我需要你的帮助,请给我一些建议.从编程珍珠我知道要生成随机30位整数,我们应该像这样写:

RAND_MAX*rand()+rand()
Run Code Online (Sandbox Code Playgroud)

但是,我可以做什么来产生不是30,而是64位随机整数呢?我认为这是非常低效的方法,如果我乘以两个30位整数然后再乘以4位整数,那么我应该使用什么样的方法?我现在使用popcount_1不同的64位方法,我想在随机整数上测试它(我也在测量每个完成任务所需的时间)

Jam*_*nze 7

首先,我怀疑你为30位整数发布的解决方案. RAND_MAX本身可能是一个31位的值,并且RAND_MAX * rand() + rand()可能会溢出,产生未定义的行为(实际上是负值).

如果您需要一个大于保证最小值的值RAND_MAX,或者就此而言,任何不小于的值 RAND_MAX,唯一的解决方案是使用连续调用 rand(),并组合这些值,但您需要仔细执行此操作,并验证结果.(大多数rand()使用线性全等生成器的实现虽然适用于某些任务,但在这种情况下并不是特别好.)无论如何,类似于:

unsigned 
rand256()
{
    static unsigned const limit = RAND_MAX - RAND_MAX % 256;
    unsigned result = rand();
    while ( result >= limit ) {
        result = rand();
    }
    return result % 256;
}

unsigned long long
rand64bits()
{
    unsigned long long results = 0ULL;
    for ( int count = 8; count > 0; -- count ) {
        results = 256U * results + rand256();
    }
    return results;
}
Run Code Online (Sandbox Code Playgroud)

(代码rand256用于消除将RAND_MAX值映射到256个值时不可避免的偏差.)

  • @arunmoezhi如果你可以生成64个随机位,你可以通过生成64生成61,并抛出3个; 例如,通过屏蔽前三位. (2认同)

due*_*l0r 3

这可能是一个解决方案,无需乘法:

r30 = RAND_MAX*rand()+rand()
s30 = RAND_MAX*rand()+rand()
t4  = rand() & 0xf

res = (r30 << 34) + (s30 << 4) + t4
Run Code Online (Sandbox Code Playgroud)