【经典题目】rand7()生成rand10()——随机数算法

随机数算法的转换

【经典题目】rand7()生成rand10()——随机数算法_第1张图片

从小数向大数映射

这一类的算法主要分为两种,一种是从小数映射向大数,rand7()-->rand10()。另外一种是从大数映射向小数rand10()-->rand7()

这道题目是从小数映向大数,核心公式 ( r a n d 7 ( ) − 1 ) ∗ 7 + r a n d 7 ( ) (rand7()-1)*7+rand7() (rand7()1)7+rand7(),也就是生成0-6的数字,然后放大7倍,保证每两个数字之间都有七个空位可以填充,然后再生成七个数字进行填充。这种方法的生成的范围是【1-49】((0,6)*7+(1,7),因此最后只需要保留【1-40】的数字即可。

如果进行优化的话,还可以进一步利用生成的【41-49】的随机数,再次放大7倍,如此重复即可。

从大数向小数映射

从大数向小数映射相对简便,只需要保留想要的范围即可
如,rand10()-->rand7()只需要保留属于1-7的数字,或者借助取模rand50()-->rand7(),对1-49数值,进行 x % 7 + 1 x \% 7+1 x%7+1

你可能感兴趣的:(leetcode经典题目,算法,python)