随机数的生成
请问为什么生成0到99的随机数要这样算 直接random(1,100)生成1-100随机数不可以吗
本帖最后由 bin554385863 于 2019-7-18 02:08 编辑
你要明白% 作为C语言的运算的含义,就不会问这个问题了
%作为运算符在C语言的含义是取余运算,说白了就是取两个数相除的余数.
rand()%100, 不管rand()随机到的数是多少,它除以100的余数不可能>=100 minjun 发表于 2019-7-17 16:57
直接random(1,100)
生成1-100随机数不可以吗
兄弟C语言没有这种写法和函数.
这种方法是Python的吧. 毕竟是伪随机,你可以自己写个函数就,通过一系列运算,传入参数,传出随机值。本质上和随机数算法没有区别,系统自带的只不过封装成库了 其实,个人认为,这种算法是有一点问题的。
rand()生成的是0-32767之间的随机数,你把这个数以100为除数取余的话,那么0-67的概念将比68-99的概率高1/327。
1/327的影响也许不大。但是,随着范围的增长,这个误差将随之变大,
比如,如果你想要的范围是20000以内的随机数的话,那么0-12767的概率将是剩下的数的两倍。
要改善这个问题,可以考虑两个方法,
一、对于多出来的概率,可以考虑将其舍去:int randint(int lowbound, int highbound) {
int range = highbound - lowbound;
int ret;
while ((ret = rand()) / range == 32768 / range);//如果得到的值是“多出来的概率”,那么将再次计算;
return ret % range + lowbound;
}
二,可以考虑将这个rand的范围再扩大,以减小误差:
unsigned int rand32() {
return rand() << 16 + rand();
}
总之就是这个方法虽然大家都在用,但是也不要无脑使用,当随机的范围较大或者要求的“随机性”较高时,需要考虑下是否需要做一些其他的处理
bin554385863 发表于 2019-7-18 02:09
兄弟C语言没有这种写法和函数.
这种方法是Python的吧.
抱歉,没有看清楚 哈哈哈 %是取余操作符,对100取余的结果必然小于100。
页:
[1]