我想创建一个介于1和动态值bit_cnt
之间的rand()范围。使用mod计算rand的动态范围
在阅读了关于rand()函数的更多信息之后,我了解到rand()的开箱即用的范围是[0,RAND_MAX]。我也明白,RAND_MAX的值是依赖库的,但保证至少为32767.
我必须创建一个64位的位掩码。
现在,我试图左移位掩码的动态值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)));
和64位下面20行输出:
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;
}
近来[回答问题](http://stackoverflow.com/questions/35490210/how-to-generate-a-random-number-from-whole-范围-int-in-c/35490477#35490477)虽然被评论为不可移植,但你可以适应64位int。 –
浮点与这个问题有什么关系?而且,自问题更新以来,如果只有最低位是随机的,那么64位是什么意思?如果你只想要随机化的最低位,用'1','3','7','15'等掩码'rand()'。 –
@WeatherVane我查看了另一个问题中的代码。在你的代码中,你能解释值17,2和3来自哪里吗?谢谢。另外,我遇到了浮点异常,因为rand()上的mod函数变为0.使用update,值1,3,7和15来自哪里? –