尝试使用随机的32位二进制数填充数组

时间:2014-02-02 02:21:40

标签: c arrays random binary

我有一项任务是用标准C编程生命游戏。我只允许使用一维数组。我的第一个问题是尝试使用随机32位二进制数字填充我的数组。我已经尝试过编写代码来执行此操作(由我的老师提供的代码完全没有评论,所以我在某种程度上不知道我在做什么)。当我尝试显示数组的内容时,似乎在每个索引处的值都是相同的。你能帮我用32个随机二进制数字(长度为32位)填充我的数组。

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

#define ARSZ 32 

void displayBinary(unsigned long* , int);
unsigned long init32();

unsigned long Row[ARSZ];

int main(void){

    int i, j;

    for (i=0;i<ARSZ;i++){
        Row[i] = init32();
    }//populate array

    for (j=0;j<ARSZ;j++){
        displayBinary(Row, j);
        printf("\n");
    }//display array contents
}/** End Main **/


void displayBinary(unsigned long array[], int x){

    unsigned long MASK = 0x80000000;
    do {
        printf("%c", (array[x] & MASK) ?'X':0x20);
    }while ((MASK >>=1) != 0);
}

unsigned long init32(){

    unsigned long init32;
    srand(time(NULL));  
    init32 = ((double)rand()/RAND_MAX)*0xFFFFFFFF;
    return init32;
}

2 个答案:

答案 0 :(得分:1)

您需要更改种子。 srand(time(NULL))调用将返回相同的值序列,因为种子没有更改。

粗略地看一下伪随机数生成器在C中是如何工作的,这是有道理的。

答案 1 :(得分:0)

1)重复调用srand(time(NULL))。而不是在srand()中调用init32(),而是在main()中调用一次。 @WhozCraig,@ Albert Myers

2)带有init32 = ((double)rand()/RAND_MAX)*0xFFFFFFFF;的RAND_MAX可能太小。 C只要求RAND_MAX至少为32767.这会给init32最多32768个不同的值。要确定生成32位随机数,请使用:

unsigned long init32;
init32 = rand();
init32 <<= 15;
init32 ^= rand();
init32 <<= 15;
init32 ^= rand();
// if pedantic
init32 &= 0xFFFFFFFFL;

注意:
如果RAND_MAX + 1不是2的幂,则会产生32位数生成的小偏差 此外,rand()本身有时也不是均匀随机的 - 取决于平台。