方法一:生成两个(1,5)的随机数,这样一共是25种情况,注意这两个数是有顺序的,从这25种情况中,取前21种,每三种代表(1,7)中的一个数字,如果取到的是这21种以外的情况,丢掉重新取。 方法二:生成三个(1,5)的随机数,分别表示一个二进制位,其中1和2映射为0,3跳过,4和5映射为1。这样产生的三位二进制...
(给定一个随机数生成器,这个生成器能均匀生成1到5(1,5)的随机数,如何使用这个生成器生成均匀分布的1到7(1,7)的数?) 解法一: 拒绝采样定理 简单的说, 把 1-5 的随机数发生器用两次, 拼成一个5进制的数, 就是1-25. 将这 1-25 平均分配的25种情况映射到7种情况上, 问题就解决了. 因为21是7的倍...
import random # 原有生成1-5随机数的函数 def random_5(): return random.randint(1, 5) # 要获得的生成1~7随机数的函数 def random_7(): while True: # 避免没有返回值 n = (random_5()-1)*5 + random_5()-1 # 生成0~24的随机数 if n <= 20: return n % 7 + 1 if __name__...
从 rand25 生成 rand21 rand21 除以3,得到 rand7 import random import collections def rand5()...
在随机数生成器领域,要从一个均匀分布的1-8随机数生成器转换成1-7随机数生成器,可以通过随机性萃取器(Randomness extractor)来实现。理论上,使用每次rand8生成3比特信息,即可支撑每次rand7调用,最高效率可达每次rand8支撑大约1.33次rand7调用。使用朴素的拒绝采样(Rejection Sampling)方法,每次...
1、1~5随机函数 publicstaticintsourceFunc() {return(int) (Math.random() * 5) + 1; } 2、将原函数转化为[0,1]返回值的函数 publicstaticinttmpFunc() {inti =sourceFunc();if(i < 3) {return0; }elseif(i > 3) {return1; }else{returntmpFunc(); ...
先说结论:尝试了四种方法,rand8 相对 rand7 的调用次数分别为 8/7、6/6.25、6/7、1536/1855。 前排插入一个 rand8 作弊器。 考虑到 rand8 返回 1-8,可以 -1 得到 0~7,二进制可以完整地覆盖一个 3bit 数的值。因为 rand8 足够随机,所以可以认为 3bit 二进制数的每一个 bit 都是随机的。生成 3...
其实从大的随机数生成小的随机数是简单的,一般面试会反过来,从小的随机数生成大的,会稍微复杂一点点...
摘要:代码如下: 正文: package test; import java.util.Random; public class TestRandom { public...
如果函数f()生成随机数的范围是[1,5],即大于等于1和小于等于5范围的随机数,则要生成[1,7]的随机数,或者说f()是[a,b]范围的随机数要生成[c,d]范围的随机数的方法是:((f()-a)/(b-a))*(d-c)+c,本例a=1,b=5,c=1,d=7 f()-a的随机数范围是[0,b-a],本例是[0,4]...