由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 一个经典的随机数的问题。求教。
相关主题
如果给随即函数rand[1,5] 如何产生rand[1,7]请教一道面试题
问一道题google intern 电面面经
求教Careercup 150 上的一道题目rand5 -> rand7的解法?
一个面试题,不会做,大家看看问一个老题
请教个弱题:random generator: from 1~5 to 1~7问一下shuffle card问题
谁还记得这道面试题吗?问个随机数的问题
Yelp 面经amazon 新鲜面筋
讨论一道经典题问一个面试题
相关话题的讨论汇总
话题: rand5话题: random话题: uniformly话题: between话题: now
进入JobHunting版参与讨论
1 (共1页)
H******7
发帖数: 1728
1
在别的论坛看到别人再问。觉得不太明白。
Expand a random range from 1-5 to 1-7
int i;
do
{
i = 5 * (rand5() - 1) + rand5(); // i is now uniformly random between 1
and 25
} while(i > 21);
// i is now uniformly random between 1 and 21
return i % 7 + 1; // result is now uniformly random between 1 and 7
WHy can't I just put
i = 6*(rand5()-1);
t**********n
发帖数: 145
2
1没有保证平均概率
2返回的数值的范围也不对呀

在别的论坛看到别人再问。觉得不太明白。
Expand a random range from 1-5 to 1-7
int i;
do
{
i = 5 * (rand5() - 1) + rand5(); // i is now uniformly random between 1
and 25
} while(i > 21);
// i is now uniformly random between 1 and 21
return i % 7 + 1; // result is now uniformly random between 1 and 7
WHy can't I just put
i = 6*(rand5()-1);

【在 H******7 的大作中提到】
: 在别的论坛看到别人再问。觉得不太明白。
: Expand a random range from 1-5 to 1-7
: int i;
: do
: {
: i = 5 * (rand5() - 1) + rand5(); // i is now uniformly random between 1
: and 25
: } while(i > 21);
: // i is now uniformly random between 1 and 21
: return i % 7 + 1; // result is now uniformly random between 1 and 7

H******7
发帖数: 1728
3
范围没事,可以用 rejection sampling解决。

【在 t**********n 的大作中提到】
: 1没有保证平均概率
: 2返回的数值的范围也不对呀
:
: 在别的论坛看到别人再问。觉得不太明白。
: Expand a random range from 1-5 to 1-7
: int i;
: do
: {
: i = 5 * (rand5() - 1) + rand5(); // i is now uniformly random between 1
: and 25

t**********n
发帖数: 145
4
嗯范围可以解决,
但是理论上可以证明,rand5()是没有能力只通过一次随机数的产生,和一些四则运算
,来获得更大范围的随机数的。
(前提是,这里说的都是整数哦。。。如果是实数范围的话另当别论啦。)
所以必须通过多次rand5()才行呢

范围没事,可以用 rejection sampling解决。

【在 H******7 的大作中提到】
: 范围没事,可以用 rejection sampling解决。
D*********y
发帖数: 876
5
5*(rand5()-1):产生0,5,10,15或者20
5 * (rand5() - 1) + rand5()就是1-25之间的随机数
如果我没有记错的话,后面那个while应该是:
if(i<21) return i%7
while(i > 21);
// i is now uniformly random between 1 and 21
return i % 7 + 1;
产生的是2-5,就不对了
至于楼主的做法,
i = 6*(rand5()-1),产生的是0,6,12,18或者24
z**c
发帖数: 625
6
你那个结果出来就是0,6,12,18,24
去掉24,剩下0,6,12,18
取模之后是0,6,5,3
+1之后是1,7,6,4
所以你这个最后产生的是1,4,6,7,各25%概率,根本不是1-7的uniform

【在 H******7 的大作中提到】
: 在别的论坛看到别人再问。觉得不太明白。
: Expand a random range from 1-5 to 1-7
: int i;
: do
: {
: i = 5 * (rand5() - 1) + rand5(); // i is now uniformly random between 1
: and 25
: } while(i > 21);
: // i is now uniformly random between 1 and 21
: return i % 7 + 1; // result is now uniformly random between 1 and 7

1 (共1页)
进入JobHunting版参与讨论
相关主题
问一个面试题请教个弱题:random generator: from 1~5 to 1~7
一道onsite面试题谁还记得这道面试题吗?
CLSR: how to generate random(a, b) with random(0,1)Yelp 面经
为什么 我写个程序这么慢呢讨论一道经典题
如果给随即函数rand[1,5] 如何产生rand[1,7]请教一道面试题
问一道题google intern 电面面经
求教Careercup 150 上的一道题目rand5 -> rand7的解法?
一个面试题,不会做,大家看看问一个老题
相关话题的讨论汇总
话题: rand5话题: random话题: uniformly话题: between话题: now