随机数产生转换-根据(1,5)随机数生成器,生成(1,7)之内的随机数
来源:互联网 发布:淘宝网返利如何领取 编辑:程序博客网 时间:2024/04/27 19:05
1. 题目
给定一个随机数生成器,这个生成器能均匀生成1到5(1,5)的随机数,如何使用这个生成器生成均匀分布的1到7(1,7)的数?
2. 思路
方法一:生成两个(1,5)的随机数,这样一共是25种情况,注意这两个数是有顺序的,从这25种情况中,取前21种,每三种代表(1,7)中的一个数字,如果取到的是这21种以外的情况,丢掉重新取。
方法二:生成三个(1,5)的随机数,分别表示一个二进制位,其中1和2映射为0,3跳过,4和5映射为1。这样产生的三位二进制数,即1-8这8个数字都是等概率的。如果产生的是8,那么丢弃即可。
方法三:生成两个(1,5)的随机数,产生一个两位的五进制数,5 * (random5() – 1) + random5()。这个公式能够等概率产生1-25,即第一个随机数代表:0,5,10,15,20,地位代表1,2,3,4,5。这样对这个数字(1-25的数字),采用方法一的方法,只用1-21,分7分,代表1-7,22-25这4个数字扔掉。
3. 参考
根据(1,5)随机数生成器,生成(1,7)之内的随机数
[编程之美]随机数范围扩展方法总结
问题描述
已知random3()这个随机数产生器生成[1, 3]范围的随机数,请用random3()构造random5()函数,生成[1, 5]的随机数?
问题分析
如何从[1-3]范围的数构造更大范围的数呢?同时满足这个更大范围的数出现概率是相同的,可以想到的运算包括两种:加法和乘法
考虑下面的表达式:
3 * (random3() – 1) + random3();
可以计算得到上述表达式的范围是[1, 9] 而且数的出现概率是相同的,即1/9
下面考虑如何从[1, 9]范围的数生成[1, 5]的数呢?
可以想到的方法就是 rejection sampling 方法,即生成[1, 9]的随机数,如果数的范围不在[1, 5]内,则重新取样
解决方法
int random5(){ int val = 0; do { val = 3 * (random3() - 1) + random3(); } while (val > 5); return val;}
归纳总结
将这个问题进一步抽象,已知random_m()随机数生成器的范围是[1, m] 求random_n()生成[1, n]范围的函数,m < n && n <= m *m
一般解法:
int random_n(){ int val = 0 ; int t; // t为n最大倍数,且满足 t <= m * m do { val = m * (random_m() - 1) + random_m(); } while (val > t); return val;}
参考资料:
http://stackoverflow.com/questions/137783/expand-a-random-range-from-1-5-to-1-7
来自yaronspace.cn 本文链接:http://yaronspace.cn/blog/archives/1326- 随机数产生转换-根据(1,5)随机数生成器,生成(1,7)之内的随机数
- 随机数产生转换-根据(1,5)随机数生成器,生成(1,7)之内的随机数
- 随机数产生转换-根据(1,5)随机数生成器,生成(1,7)之内的随机数
- 如何根据可以产生1-5随机数的函数自己产生1-7的随机数?
- 使用1-5随机数生成器产生1-7的随机数(Google Technical Interview)
- #随机数#产生1~n之间的随机数
- 利用随机生成器[1,5]生成随机数[1,7]
- 利用随机生成器[1,5]生成随机数[1,7]
- 给定产生1-5的随机数,求1-7的随机数函数
- C++随机数生成器mt19937生成随机数的用法
- 生成1-10的随机数
- 算法:1-5均匀的随机数,生成1-7的均匀随机数
- 如何用[1,5]的随机数生成[1,7]的随机数
- 根据种子生成随机数。
- 通过一个可以随机产生0和1的随机数生成产生0到n的随机数
- C#产生随机数之一 生成真随机数
- 利用1~7的随机数,产生一个1~10的随机数
- 严格的随机数生成器
- 大数据时代 摘录一
- php 扩展sqlsrv调用mssql存储过程
- HDU 2094 产生冠军
- 日历生成装置和日历生成方法
- UI第十一天
- 随机数产生转换-根据(1,5)随机数生成器,生成(1,7)之内的随机数
- Linux C高级编程——文件操作之库函数
- 敏捷开发需要编写文档吗?
- java操作阿里云的对象存储OSS
- IT忍者神龟之 Linux必学的60个命令
- 又见01背包(数据较大,重量和价值互换)
- Fragment如何避免onCreateView重复调用
- Java方法签名与JNI,反射
- [VS2010].NET4.0环境下使用.NET2.0程序集,出现“混合模式程序集异常”