2012-04-16 126 views
0

我想找到一个c函数,它可以产生一个32位随机/伪随机数,并且可以被复制。 (就像rand/srand函数一样)。我无法使用urandom,因为我无法像srand/rand那样重现序列。我是否必须编写自己的函数或者做这样的事情已经存在?随机发生器

谢谢

为了将来的参考,而别人的建议是好的。最后我做这样的事情:

uint32_t generateRandom (unsigned int randomSeed) { 
    uint32_t number = 0; 
    int randomNumber, x; 

    for (x=0; x<8;x++) { 
     randomNumber = rand_r(&randomSeed) % 16; 
     number |= (randomNumber<<(x*4)); 
     randomSeed++; 
    } 
    return (number); 
} 
+3

你为什么不使用rand/srand? – MByD 2012-04-16 21:04:21

+4

您的哪些需求使用'rand' /'srand'排除? – 2012-04-16 21:04:29

+0

我试图写入一些内存位置(试图打开和关闭某些位),因为我需要生成一个32位整数,rand/srand只接受一个unsigned long int ...这给了我一个非常小的数。 – Falcata 2012-04-16 21:06:54

回答

2

加入2 (或更多)rand()结果获取您需要的位数。
不好(因为它是夸张的)例子:

uint32_t bit0 = rand() & 1; 
uint32_t bit1 = rand() & 1; 
/* ... */ 
uint32_t bit31 = rand() & 1; 

uint32_t whole = bit0 | (bit1 << 1) | ... | (bit31 << 31); 
+0

谢谢!但有点晚了:P我最终做了类似的事情(见编辑)非常感谢虽然:) – Falcata 2012-04-16 21:57:20

2

RAND_MAX 2147483647 Linux上的,所以如果你不想扩大兰特()(并消除一半的可能性),使用mrand48()并解释返回值作为一个unsigned long

2

从你的问题你的意见,我为什么不使用rand()srand()无法捉摸。是否因为他们不在正确的范围内?如果是这样,这样做:

uint32_t random_num; 
int i, random_byte; 
srand(SEED_VALUE); 

random_num = 0; 
for (i = 0; i < 4; i++) { 
    random_byte = rand() & 0xff; 
    random_num = (randum_num << 8) + random_byte; 
} 

不是最有效的代码可能,但相当快的和应该做你想要什么。