通过双向链表找前驱的方法计算一定范围的随机整数出现的比例,探索C语言rand()的性能

代码

#define MAXSIZE 1000

int random(int min, int max){
	return rand() % (max - min + 1) + min;
}

void randNumPercent(LinkedList L){
	srand((unsigned int)time(NULL));
	int *a = (int*)malloc(sizeof(int)*MAXSIZE);
	for (int j = 0; j < MAXSIZE; j++){
		int count = 0;
		for (int i = 0; i < MAXSIZE; i++)
			insertListT(L, random(1, MAXSIZE));//1~1MAXSIZE上的随机整数插入链表(尾插)
		for (int i = 1; i <= MAXSIZE; i++){
			if(getPrior(L, i))//找到i,返回前驱值,否则返回0
				count++;
		}
		a[j] = count;//1~MAXSIZE上的整数随机生成MAXSIZE次,多少个数不一样,记为count
		clearList(L);//每轮循环清空链表(保留头节点)
	}
	int sum = 0;
	for (int j = 0; j < MAXSIZE; j++)
		sum += a[j];
	printf("比例为%.1f%%\n", (sum/MAXSIZE)*0.1);
}

int main(){
	LinkedList L;
	initList(L);
	randNumPercent(L);
	
	return 0;
}

输出

在这里插入图片描述

分析

最后输出大多时候是63.2%,少数时候是63.1%,±0.1视为误差,说明随机生成1000个1~1000上的随机整数,有632个不相同的数。

结论

实验涉及到了1000^2 = 10^6个数的比较和计算,非常精确(做MAXSIZE=10000时的实验时直接卡住了。。。),有理由相信C语言rand()每次生成不重复数的概率为63.2%

吐槽:这只是我在写双向链表时的突发奇想,当然,如果纯粹地想得到结论,一个数组就够了,不需要这些“花(sha)里(bi)胡(dong)哨(xi)”,汗!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值