2016-02-19 42 views
-1

我想创建一个介于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; 
    } 
+0

近来[回答问题](http://stackoverflow.com/questions/35490210/how-to-generate-a-random-number-from-whole-范围-int-in-c/35490477#35490477)虽然被评论为不可移植,但你可以适应64位int。 –

+0

浮点与这个问题有什么关系?而且,自问题更新以来,如果只有最低位是随机的,那么64位是什么意思?如果你只想要随机化的最低位,用'1','3','7','15'等掩码'rand()'。 –

+0

@WeatherVane我查看了另一个问题中的代码。在你的代码中,你能解释值17,2和3来自哪里吗?谢谢。另外,我遇​​到了浮点异常,因为rand()上的mod函数变为0.使用update,值1,3,7和15来自哪里? –

回答

2

的问题是,如果bit_cnt0anything % bit_cnt会得到一个错误。您需要检查bit_cnt之前您尝试执行模数。

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

你所有的尝试都执行了模数,然后试着对结果做些什么,但那是错误发生之后。

+0

请参阅我的编辑。 –

+0

我不明白输出与问题的关系。这些数字来自哪里,以及是否显示32位或64位数字? – Barmar

+0

'bit_cnt'的值从哪里来? – Barmar

0

这使用位数生成掩码。如果您想要的位数大于可由RAND_MAX填充的位数,请执行前面评论的另一个随机函数。

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main(void) { 

    int bit_cnt = 10; 
    unsigned mask = 0; 
    int i; 
    int num; 
    srand((unsigned)time(NULL)); 

    for(i = 0; i < bit_cnt; i++) 
     mask = (mask << 1) | 1; 

    printf ("For bit_cnt=%d, mask=0x%X\n\n", bit_cnt, mask); 

    for (i = 0; i < 5; i++) { 
     num = rand() & mask; 
     printf("Random number 0x%0*X\n", 1+(bit_cnt-1)/4, num); 
    } 
} 

程序输出:

For bit_cnt=10, mask=0x3FF 

Random number 0x327 
Random number 0x39C 
Random number 0x1B1 
Random number 0x088 
Random number 0x26E