gpt4 book ai didi

用 mod 计算 rand 的动态范围

转载 作者:行者123 更新时间:2023-11-30 18:51:56 25 4
gpt4 key购买 nike

我想创建一个介于 1 和 bit_cnt 动态值之间的 rand() 范围.

在阅读了有关 rand() 函数的更多信息后,我了解到开箱即用的 rand() 的范围为 [0, RAND_MAX]。我还了解 RAND_MAX 的值取决于库,但保证至少为 32767。

我必须创建一个 64 个 0 的位掩码。

现在,我尝试将位掩码左移动态值 bit_cnt与 1 和动态值 bit_cnt 之间随机生成的位数进行与运算.

例如,当bit_cnt时是 10,我想随机化最低 10 位。

本来我有

mask = (mask << bit_cnt) + (rand()% bit_cnt);

这导致了浮点异常。据我了解,发生该异常是因为 bit_cnt 的值变成0。

因此,我尝试创建这样的 if 语句:

if((rand()%bit_cnt))!=0){
mask = (mask << bit_cnt) + (rand()% bit_cnt);
}

,但还是出现浮点异常。

然后我尝试了以下方法,认为该值不为 0,因此将值至少增加到 1:

mask = (mask << bit_cnt) + ((rand()% bit_cnt)+1);

,但还是出现浮点异常。

之后,我尝试了以下方法:

mask = (mask << bit_cnt) + (1+(rand()%(bit_cnt+1)));

并输出以下 20 行 64 位:

0000000000000000000000000000000000000000000000000000000000000010
0000000000000000000000000000000000000000000000000000000000000011
0000000000000000000000000000000000000000000000000000000000000101
0000000000000000000000000000000000000000000000000000000000001010
0000000000000000000000000000000000000000000000000000000000010011
0000000000000000000000000000000000000000000000000000000000100011
0000000000000000000000000000000000000000000000000000000001000110
0000000000000000000000000000000000000000000000000000000010000100
0000000000000000000000000000000000000000000000000000000100001001
0000000000000000000000000000000000000000000000000000001000000010
0000000000000000000000000000000000000000000000000000010000000100
0000000000000000000000000000000000000000000000000000100000000111
0000000000000000000000000000000000000000000000000001000000000101
0000000000000000000000000000000000000000000000000010000000001001
0000000000000000000000000000000000000000000000000100000000000111
0000000000000000000000000000000000000000000000001000000000001111
0000000000000000000000000000000000000000000000010000000000001010
0000000000000000000000000000000000000000000000100000000000000101
0000000000000000000000000000000000000000000001000000000000001101
0000000000000000000000000000000000000000000010000000000000001100

浮点异常的原因是什么?这是动态创建 rand() 函数范围的方法吗?

我很感激任何建议。谢谢。

更新:我将 if 语句更改为以下内容:

if(bit_cnt !=0) 

然后执行其余的逻辑。

我收到以下输出:

0000000000000000000000000000000000000000000000000000000000000001
0000000000000000000000000000000000000000000000000000000000000010
0000000000000000000000000000000000000000000000000000000000000100
0000000000000000000000000000000000000000000000000000000000001000
0000000000000000000000000000000000000000000000000000000000010010
0000000000000000000000000000000000000000000000000000000000100001
0000000000000000000000000000000000000000000000000000000001000100
0000000000000000000000000000000000000000000000000000000010000110
0000000000000000000000000000000000000000000000000000000100000011
0000000000000000000000000000000000000000000000000000001000000000
0000000000000000000000000000000000000000000000000000010000001000
0000000000000000000000000000000000000000000000000000100000000111
0000000000000000000000000000000000000000000000000001000000000110
0000000000000000000000000000000000000000000000000010000000000110
0000000000000000000000000000000000000000000000000100000000001100
0000000000000000000000000000000000000000000000001000000000000010
0000000000000000000000000000000000000000000000010000000000001101
0000000000000000000000000000000000000000000000100000000000000110
0000000000000000000000000000000000000000000001000000000000010000
0000000000000000000000000000000000000000000010000000000000000100

有什么方法可以知道范围是否正确?有没有什么方法可以通过查看输出来知道?

const int LINE_CNT = 20;
void print_bin(uint64_t num, unsigned int bit_cnt);
uint64_t rand_bits(unsigned int bit_cnt);

int main(int argc, char *argv[]) {

int i;

srand(time(NULL));
for(i = 0; i < LINE_CNT; i++) {
uint64_t val64 = rand_bits(i);
print_bin(val64, 64);
}

return EXIT_SUCCESS;
}
void print_bin(uint64_t num, unsigned int bit_cnt) {

int top_bit_cnt;

if(bit_cnt <= 0) return;
if(bit_cnt > 64) bit_cnt = 64;

top_bit_cnt = 64;
while(top_bit_cnt > bit_cnt) {
top_bit_cnt--;
printf(" ");
}

while(bit_cnt > 0) {
bit_cnt--;
printf("%d", (num & ((uint64_t)1 << bit_cnt)) != 0);
}
printf("\n");

return;
}
uint64_t rand_bits(unsigned int bit_cnt) {
uintmax_t mask = 1;
if (bit_cnt != 0) {
mask = (mask << bit_cnt) + (rand()% bit_cnt);
}
return mask;
}

我正在尝试修改函数 rand_bits 以返回所有 0(最低位除外),即 bit_cnt这是随机的。返回一个 64 位模式,除了最低请求位之外全部为零,这些位是随机的。这允许以可移植的方式实现任意长度的随机位模式,因为 C 标准“rand()”函数只需要返回0 到 32767 之间的随机数...实际上是一个随机 15 位模式。参数“bit_cnt”:要随机化的最低位数量,包括最低位(位 0)。

更新:添加了 Barmar 的最新建议 mask = rand() % (1 << bit_cnt); :

0000000000000000000000000000000000000000000000000000000000000001
0000000000000000000000000000000000000000000000000000000000000001
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000010
0000000000000000000000000000000000000000000000000000000000001000
0000000000000000000000000000000000000000000000000000000000001001
0000000000000000000000000000000000000000000000000000000000000010
0000000000000000000000000000000000000000000000000000000000010101
0000000000000000000000000000000000000000000000000000000001001111
0000000000000000000000000000000000000000000000000000000010000011
0000000000000000000000000000000000000000000000000000001010101001
0000000000000000000000000000000000000000000000000000010101101100
0000000000000000000000000000000000000000000000000000101011111000
0000000000000000000000000000000000000000000000000001001010101111
0000000000000000000000000000000000000000000000000011101011000101
0000000000000000000000000000000000000000000000000001001101111101
0000000000000000000000000000000000000000000000001111000000111010
0000000000000000000000000000000000000000000000000101100000001100
0000000000000000000000000000000000000000000000100111101000111111
0000000000000000000000000000000000000000000001010101011101000110



uint64_t rand_bits(unsigned int bit_cnt) {
uintmax_t mask = 1;
if (bit_cnt != 0) {
mask = rand() % (1 << bit_cnt);
}
return mask;
}

最佳答案

问题是 anything % bit_cnt如果 bit_cnt 将会收到错误是 0 。您需要检查bit_cnt 尝试执行模数之前。

if (bit_cnt != 0) {
mask = (mask << bit_cnt) + (rand()% bit_cnt) + 1;
}

您的所有尝试都执行了模数,然后尝试对结果执行某些操作,但那是在错误发生之后。

关于用 mod 计算 rand 的动态范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35516819/

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