周梦琦 发表于 2019-7-17 15:38:47

随机数的生成

请问为什么生成0到99的随机数要这样算

minjun 发表于 2019-7-17 16:57:23

直接random(1,100)
生成1-100随机数不可以吗

bin554385863 发表于 2019-7-17 23:15:29

本帖最后由 bin554385863 于 2019-7-18 02:08 编辑

你要明白% 作为C语言的运算的含义,就不会问这个问题了
%作为运算符在C语言的含义是取余运算,说白了就是取两个数相除的余数.

rand()%100, 不管rand()随机到的数是多少,它除以100的余数不可能>=100

bin554385863 发表于 2019-7-18 02:09:38

minjun 发表于 2019-7-17 16:57
直接random(1,100)
生成1-100随机数不可以吗

兄弟C语言没有这种写法和函数.

这种方法是Python的吧.

AmosAlbert 发表于 2019-7-18 13:21:47

毕竟是伪随机,你可以自己写个函数就,通过一系列运算,传入参数,传出随机值。本质上和随机数算法没有区别,系统自带的只不过封装成库了

Croper 发表于 2019-7-18 14:03:48

其实,个人认为,这种算法是有一点问题的。
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();
}

总之就是这个方法虽然大家都在用,但是也不要无脑使用,当随机的范围较大或者要求的“随机性”较高时,需要考虑下是否需要做一些其他的处理

minjun 发表于 2019-7-18 14:52:40

bin554385863 发表于 2019-7-18 02:09
兄弟C语言没有这种写法和函数.

这种方法是Python的吧.

抱歉,没有看清楚 哈哈哈

YiMingC 发表于 2019-7-18 19:13:13

%是取余操作符,对100取余的结果必然小于100。
页: [1]
查看完整版本: 随机数的生成