一个校验概率的奇怪问题

kgdso 2006-08-17 05:25:23
我写了一个计算n个数校验和的程序,每个数在0-255之间(模仿2位16进制数)。
程序如下:
#include<iostream>
#include <time.h>
using namespace std;
void main()
{
const int len=100;//n个数,可尝试10,100,127,128,254,255,256,257,511,512,513等
const long times=10000;
const int testtimes=100;
srand(time(0));
long i=0;
int num=0;
int data[len];
int random[len];
double rate=0;
int n=0;

while(n<testtimes)
{
num=0;
int checksum=0;
for(i=0;i<len;i++) data[i]=rand()%256;
for(i=0;i<len;i++) checksum+=data[i];
for(i=0;i<times;i++)
{
int j;
int rck=0;
for(j=0;j<len;j++) random[j]=rand()%256;
for(j=0;j<len;j++) rck+=random[j];
if(rck==checksum) num++;
}
n++;
rate+=(100*(double)num/(double)times);
}
cout<<"test times:"<<testtimes<<endl;
cout<<"The average rate of "<<len<<" numbers in "<<times<<" times transfer is "<<rate/(double)n<<"%"<<endl;
}
不断地修改len(数字的个数),发现len越大,出现相同checkSum的机会越低,即rate越小。
但是。。。
在256的倍数的附近,rate的分布呈凹曲线状态。就是当len为256的倍数时,rate的值都比较高,而且都是在0.045%附近。256为随机数可能出现的范围(0-255)的个数。
我的测试结果:
len=10, rate=0.1196%
len=20, rate=0.0815%
len=50, rate=0.053%
len=100, rate=0.0383%

len=126, rate=0.0342%
len=128, rate=0.0457%***
len=129, rate=0.034%

len=254, rate=0.023%
len=255, rate=0.0234%
len=256, rate=0.0486%***
len=257, rate=0.022%

len=511, rate=0.0152%
len=512, rate=0.0501%***
len=513, rate=0.0155%

请问为什么在len=256的倍数那些点上,出现相同checksum的概率会突然提高呢?
我检查了一下我的程序,也没有发现什么大问题,请各位指教一下,谢谢了。
...全文
216 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zuguanqun 2006-08-18
  • 打赏
  • 举报
回复
up
kgdso 2006-08-18
  • 打赏
  • 举报
回复
没有人看一下吗...?
herman~~ 2006-08-17
  • 打赏
  • 举报
回复
关注
Roxxette 2006-08-17
  • 打赏
  • 举报
回复
把 rand()%256 换成 (int)(1+256.0*rand()/(RAND_MAX+1.0)) 再试试
Dong 2006-08-17
  • 打赏
  • 举报
回复
友情帮顶

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧