首先,我怀疑你为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个值时不可避免的偏差.)
这可能是一个解决方案,无需乘法:
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)
| 归档时间: |
|
| 查看次数: |
15565 次 |
| 最近记录: |