《c和指针》笔记--让rand更随机一点

在c语言中如果要获取1~10的随机数,那么可能大部分人的想法都是通过以下代码获取:

rand()%10+1;

(虽然rand生成的是一个伪随机数,但是这边姑且认为他是真随机的吧)

但是生成1~10的概率真的是一样的吗?

不是的,下面我们来分析以下。

假如rand返回的最大值为105,那么使用上面那种方法获取的随机数那么生成1~6的概率要比生成7~10的概率要大,

看出来了吗?因为如果rand函数返回值的范围为0~99,那么使用上面的方式生成1~10的概率是一样的,但是,

现在rand返回值范围为0~105,如果rand返回100,则rand()%10+1的值为1,相当于1的概率要比其他数要大一点,

依此类推,生成1~6的概率要大一点点。

所以如果要使生成的数更随机一点,可以使用下面的代码:

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

int get_rand10( void ){
	int value;
	int max_rand = ( ( RAND_MAX + 1 ) / 10 ) * 10 -1;
	srand( (unsigned int) time(NULL) );
	do{
		value = rand();
	}while(value > max_rand);
	return value % 10 + 1;
}

一般情况下不必使用上面的方法,但是需要生成的随机数的最大值越接近于RAND_MAX,则越要考虑使用上面的方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值