c语言c=rand()%3,为什么数字1,2和3出现如此频繁使用C rand()函数?

博客探讨了在生成大量随机数时,为何数字0、1和2出现频率较高的问题。通过修改代码,使用不同的随机数生成方法,观察到结果趋向于均匀分布。实验结果显示,特定数字的频率接近理想状态,表明随机数生成器的改进有助于提高随机性的质量。
摘要由CSDN通过智能技术生成

我想做的是生成一些随机数字(不一定是单个数字)

29106

7438

5646

4487

9374

28671

92

13941

25226

10076

然后计数我获得的位数:

count[0] = 3 Percentage = 6.82

count[1] = 5 Percentage = 11.36

count[2] = 6 Percentage = 13.64

count[3] = 3 Percentage = 6.82

count[4] = 6 Percentage = 13.64

count[5] = 2 Percentage = 4.55

count[6] = 7 Percentage = 15.91

count[7] = 5 Percentage = 11.36

count[8] = 3 Percentage = 6.82

count[9] = 4 Percentage = 9.09

这是我使用的代码:

#include

#include

#include

int main() {

int i;

srand(time(NULL));

FILE* fp = fopen("random.txt", "w");

// for(i = 0; i < 10; i++)

for(i = 0; i < 1000000; i++)

fprintf(fp, "%d\n", rand());

fclose(fp);

int dummy;

long count[10] = {0,0,0,0,0,0,0,0,0,0};

fp = fopen("random.txt", "r");

while(!feof(fp)) {

fscanf(fp, "%1d", &dummy);

count[dummy]++;

}

fclose(fp);

long sum = 0;

for(i = 0; i < 10; i++)

sum += count[i];

for(i = 0; i < 10; i++)

printf("count[%d] = %7ld Percentage = %5.2f\n",

i, count[i], ((float)(100 * count[i])/sum));

}

如果我生成大量的随机数(1000000),这是我得到的结果:

count[0] = 387432 Percentage = 8.31

count[1] = 728339 Percentage = 15.63

count[2] = 720880 Percentage = 15.47

count[3] = 475982 Percentage = 10.21

count[4] = 392678 Percentage = 8.43

count[5] = 392683 Percentage = 8.43

count[6] = 392456 Percentage = 8.42

count[7] = 391599 Percentage = 8.40

count[8] = 388795 Percentage = 8.34

count[9] = 389501 Percentage = 8.36

请注意,1,2和3有太多的匹配。我试过运行这几次,每次我得到非常相似的结果。

我试图理解什么可能导致1,2和3出现比任何其他数字更频繁。

从Matt Joiner和Pascal Cuoq指出的暗示,

我改了代码使用

for(i = 0; i < 1000000; i++)

fprintf(fp, "%04d\n", rand() % 10000);

// pretty prints 0

// generates numbers in range 0000 to 9999

这是我得到的(多个运行类似的结果):

count[0] = 422947 Percentage = 10.57

count[1] = 423222 Percentage = 10.58

count[2] = 414699 Percentage = 10.37

count[3] = 391604 Percentage = 9.79

count[4] = 392640 Percentage = 9.82

count[5] = 392928 Percentage = 9.82

count[6] = 392737 Percentage = 9.82

count[7] = 392634 Percentage = 9.82

count[8] = 388238 Percentage = 9.71

count[9] = 388352 Percentage = 9.71

什么可能是0,1和2被喜欢的原因?

感谢大家。使用

int rand2(){

int num = rand();

return (num > 30000? rand2():num);

}

fprintf(fp, "%04d\n", rand2() % 10000);

我得到

count[0] = 399629 Percentage = 9.99

count[1] = 399897 Percentage = 10.00

count[2] = 400162 Percentage = 10.00

count[3] = 400412 Percentage = 10.01

count[4] = 399863 Percentage = 10.00

count[5] = 400756 Percentage = 10.02

count[6] = 399980 Percentage = 10.00

count[7] = 400055 Percentage = 10.00

count[8] = 399143 Percentage = 9.98

count[9] = 400104 Percentage = 10.00

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值