Leetcode Random
文章目录
Leetcode刷题笔记- random.
(1)rand3() -> rand7()
给定一个可以等概率生成1-3的rand3()函数生成器,求解可以随机等概率生成1-7的rand7()函数生成器。
使用多个 rand3(),保证产生的值域是大于后者的,然后再产生的值域上进行裁剪取尾。
3 | 6 | 9 | |
---|---|---|---|
1 | 4 | 7 | 10 |
2 | 5 | 8 | 11 |
3 | 6 | 9 | 12 |
转成这种样子:
3 | 6 | 9 | |
---|---|---|---|
1 | 1 | 4 | 7 |
2 | 2 | 5 | 8 |
3 | 3 | 6 | 9 |
从以上的两个例子中,这种随机数的套路应该是掌握了吧。如果是 randx() 那么这个生成式子 就是 randx() + randx() *x
这个乘数必须是 x ,要不然就重复生成了一个数字,那么最后就没有办法达到等概率,至于最后的减去的数字则是根据实际情况选择。一定要生成连续不重复的数字,这样才能是等概率的。
减去的数字保证了取余能够整除的。
|
|
(2)rand2() -> rand5()
Given rand2(), you should get rand5()
如果只是使用两个 rand2() 那么只能得到四种可能性,不足以生成 rand5() ,所以要使用3 个rand2() ,这个时候得到了 8种可能性,减去3 种,那么就OK 了。( 从这个例题中可以得到是使用多个 randx() 的倍数是 x)
|
|
(3)470. Implement Rand10() Using Rand7()
基本的思路:首先构造生成器randN,N 是10的倍数,这样 randN % 10 就可以得到结果。 更加具体的操作步骤:
- rand7 可以得到 [1, 7]的等概率的数字
- (rand7() -1) *7 + (rand7() -1) 可以得到[0, 48] 的数字
- 如果产生了大于等于40大的数字,那么重复上一步操作,直到产生小于40的数字
- 将上一步骤中产生的结构 mod 10 +1 ,然后等概率随机产生了 [1, 10]的数字
|
|
|
|
(4)一个返回[0, 1] 浮点数的随机函数 random() ,请利用该函数,完成一个从52 张扑克牌中不放回抽取 3张牌的函数,要求每张牌被抽取的概率一致。
这个暂时没有很好的思路。。。。。
文章作者 jijeng
上次更新 2018-05-28