我有一项任务是用标准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;
}
答案 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()
本身有时也不是均匀随机的 - 取决于平台。