回 帖 发 新 帖 刷新版面

主题:线性同余如何生成一个固定范围的随即数

大家都知道根据公式
X(n+1)=(aXn+c) mod m n>=0
生成的随即数是小于m 可是我现在想生成1到6的随即数 要怎么办
我想了一个办法 把最后生成的随机数数列在mod 6
方法上应该是可以的 
就是不知道 是不是会破坏随即数的分布 
能不能通过X平方检验

不知道大家有没有什么更好的方法 谢谢大家

回复列表 (共5个回复)

沙发

不就是令m=6然后对随机结果+1么……至于有没有破坏分布,自己测试看看

板凳

深圳市华信群英科技有限公司与知名通信软件公司正式签订定向输送人才的合作协议
针对想进入IT软件行业的有志人士提供专业的企业内训
实训课程采用“2+3”分段教学模式,分为2个月理论强化和3个月项目实训两个阶段
实训前就签订就业安置协议,岗前实训后入职
不仅学费优惠而且是企业定向培训定向招聘,百分百保证就业
有意向请登录www.szctt.com,或加QQ:1179397962做详细咨询

3 楼


inline int RandInt(int x, int y) {return rand()%(y-x+1) + x;}
这个行不

4 楼

基本不会破坏吧?
标准的rand函数好像就是用线性同余来实现,而且我们经常写rand() % n,来取得[0, n-1]范围内随机的整数。好像效果也还不错。
数学不好,不会证明。不过就感觉上,稍微会破坏那么一点点。如果RAND_MAX比n大很多倍,则几乎不会破坏,如果RAND_MAX与n的值接近,那破坏就严重一些。

举例:假设某个函数可以产生0~2范围内的均匀分布整数序列,如果对序列中所有元素都对2取模,是否可以得到0~1范围内的均匀分布整数序列?答案应该是否定的。因为0出现的概率是1出现概率的2倍。
这里RAND_MAX和n相等,都为2,所以严重破坏了均匀性。不过如果RAND_MAX较大,而n较小,情况就好得多了。

5 楼

你就生产0到5的随机数,然后都加上1啥。

我来回复

您尚未登录,请登录后再回复。点此登录或注册