BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #48347同步于 2010/12/26
CPP机器人发帖

[合集] 问个笔试中遇到的随机数问题

shenlei
2010/12/26镜像同步0 回复
☆─────────────────────────────────────☆ beyond (囧RZ) 于 (Sun Dec 19 09:46:24 2010) 提到: 假设知道rand5()函数(等概率随机生成1-5),如何写rand7()函数(等概率随机生成1-7)? ☆─────────────────────────────────────☆ Guilt (恶魔) 于 (Sun Dec 19 09:58:04 2010) 提到: (rand5()-1)/4*6+1 感觉是这样的。。 ☆─────────────────────────────────────☆ shenlei (我爱果子|[路]|天山南北|潇湘隐士) 于 (Sun Dec 19 12:53:42 2010) 提到: 你这个俨然不正确... 这个问题有个很通用的解... 先构造一个等概率产生0和1的函数... int Rand() { int i=rand5(); if(i>=4) return 0;//2/5的概率返回0 else if(i<=2) retrun 1;//2/5的概率返回1 else retrun Rand();//再次调用,1/10的概率返回0或1 } 然后构造等概率产生1-7的函数... int rand7() { int result=0; for(int i=0;i<3;i++) { if(Rand()==1) result|=(1<<i); } if(result==0) return rand7(); return result; } 【 在 Guilt (恶魔) 的大作中提到: 】 : (rand5()-1)/4*6+1 : 感觉是这样的。。 ☆─────────────────────────────────────☆ renne (歼灭天使 玲) 于 (Sun Dec 19 12:58:24 2010) 提到: 为何不对……… 他(rand5-1)/4产生的不是随机0-1的数么? 【 在 shenlei (我爱果子|[路]|天山南北|潇湘隐士) 的大作中提到: 】 : 你这个俨然不正确... : 这个问题有个很通用的解... : 先构造一个等概率产生0和1的函数... : ................... ☆─────────────────────────────────────☆ renne (歼灭天使 玲) 于 (Sun Dec 19 13:01:43 2010) 提到: 而且lz没说随机生成1-7的是不是整数啊…… 【 在 shenlei (我爱果子|[路]|天山南北|潇湘隐士) 的大作中提到: 】 : 你这个俨然不正确... : 这个问题有个很通用的解... : 先构造一个等概率产生0和1的函数... : ................... ☆─────────────────────────────────────☆ shenlei (我爱果子|[路]|天山南北|潇湘隐士) 于 (Sun Dec 19 13:05:25 2010) 提到: 0或1乘6再加一只能得到1和7... 还有就是产生五个随机数的函数怎么能线性计算得到7个数?... 【 在 renne (歼灭天使 玲) 的大作中提到: 】 : 为何不对……… : 他(rand5-1)/4产生的不是随机0-1的数么? ☆─────────────────────────────────────☆ renne (歼灭天使 玲) 于 (Sun Dec 19 13:05:33 2010) 提到: 题目不严谨啊…… 如果rand5产生的是1 2 3 4 5的话 rand5-1就是 0 1 2 3 4 然后除4就是 0 0 0 0 1了……肯定破坏随机性了 那这样版主的解法才对 如果rand5是[1-5]区间的话……应该那个做法对吧…… 【 在 renne (歼灭天使 玲) 的大作中提到: 】 : 为何不对……… : 他(rand5-1)/4产生的不是随机0-1的数么? ☆─────────────────────────────────────☆ renne (歼灭天使 玲) 于 (Sun Dec 19 13:06:14 2010) 提到: 你理解的是0和1……我理解的是0到1…… 【 在 shenlei (我爱果子|[路]|天山南北|潇湘隐士) 的大作中提到: 】 : 0或1乘6再加一只能得到1和7... : 还有就是产生五个随机数的函数怎么能线性计算得到7个数?... ☆─────────────────────────────────────☆ Guilt (恶魔) 于 (Sun Dec 19 13:08:50 2010) 提到: 【 在 shenlei 的大作中提到: 】 : 你这个俨然不正确... : 这个问题有个很通用的解... : 先构造一个等概率产生0和1的函数... : ................... 我理解的也是连续的随机数。。不是离散的随机整数。。 ☆─────────────────────────────────────☆ FadeToBlack (口口口 <- codepage error again?) 于 (Sun Dec 19 13:09:11 2010) 提到: 你这种解法从randN()生产randX()要求X必须为2^M-1的形式咯? 【 在 shenlei 的大作中提到: 】 : 你这个俨然不正确... : 这个问题有个很通用的解... : 先构造一个等概率产生0和1的函数... : ................... ☆─────────────────────────────────────☆ shenlei (我爱果子|[路]|天山南北|潇湘隐士) 于 (Sun Dec 19 13:11:26 2010) 提到: 我看完想着如果是连续的就不难了...没有必要上来问...呵呵... 【 在 Guilt (恶魔) 的大作中提到: 】 : 我理解的也是连续的随机数。。不是离散的随机整数。。 ☆─────────────────────────────────────☆ shenlei (我爱果子|[路]|天山南北|潇湘隐士) 于 (Sun Dec 19 13:12:29 2010) 提到: 也不必啊... 比如题目要求1-12,那个方法产生0-15,判断一下,不在要求范围内重新rand,反正1-12是等概率产生的... 【 在 FadeToBlack (口口口 <- codepage error again?) 的大作中提到: 】 : 你这种解法从randN()生产randX()要求X必须为2^M-1的形式咯? ☆─────────────────────────────────────☆ Guilt (恶魔) 于 (Sun Dec 19 13:15:45 2010) 提到: 【 在 shenlei 的大作中提到: 】 : 我看完想着如果是连续的就不难了...没有必要上来问...呵呵... : 【 在 Guilt (恶魔) 的大作中提到: 】 : : 我理解的也是连续的随机数。。不是离散的随机整数。。 : ................... 哈哈。。是我想当然了。。审题不认真的老毛病啊。。 ☆─────────────────────────────────────☆ shenlei (我爱果子|[路]|天山南北|潇湘隐士) 于 (Sun Dec 19 13:18:22 2010) 提到: 也可能是我错了呵呵... 【 在 Guilt (恶魔) 的大作中提到: 】 : 哈哈。。是我想当然了。。审题不认真的老毛病啊。。 ☆─────────────────────────────────────☆ renne (歼灭天使 玲) 于 (Sun Dec 19 13:20:03 2010) 提到: 这题自己出的不严谨…… 【 在 Guilt (恶魔) 的大作中提到: 】 : 哈哈。。是我想当然了。。审题不认真的老毛病啊。。 ☆─────────────────────────────────────☆ FadeToBlack (口口口 <- codepage error again?) 于 (Sun Dec 19 13:26:58 2010) 提到: 只有回答错的,没有题目错的。 应该是 此题分两种情况考虑,实数范围内blablabla,整数范围内blablabla ps. 不过要是面试官要求面试者,那就是题目考虑不全面了。具体得分两种情况考虑,看谁是刀俎,谁是鱼肉 【 在 renne 的大作中提到: 】 : 这题自己出的不严谨…… ☆─────────────────────────────────────☆ bupt070082 (Debug) 于 (Sun Dec 19 15:46:30 2010) 提到: 利用条件概率的概念p(y|x)=p(xy)/p(x),(rand5(),rand5())可得到x-y平面25个等概率出现的坐标,取其中21个坐标,每三个映射为一个数。此时,p(x)=21/25,p(xy)=3/25,p(y|x)=1/7 int rand7() { complex<int> x; do { x=complex<int>(rand5(),rand5()); if(x==complex<int>(1,1)||x==complex<int>(1,2)||x==complex<int>(2,1)) { return 1; } else if(x==complex<int>(1,3)||x==complex<int>(2,2)||x==complex<int>(3,1)) { return 2; } else if(x==complex<int>(1,4)||x==complex<int>(2,3)||x==complex<int>(3,2)) { return 3; } else if(x==complex<int>(4,1)||x==complex<int>(1,5)||x==complex<int>(2,4)) { return 4; } else if(x==complex<int>(3,2)||x==complex<int>(4,2)||x==complex<int>(5,1)) { return 5; } else if(x==complex<int>(2,5)||x==complex<int>(3,4)||x==complex<int>(4,3)) { return 6; } else if(x==complex<int>(5,2)||x==complex<int>(3,5)||x==complex<int>(4,4)) { return 7; } } while (true); return 0; } ☆─────────────────────────────────────☆ Guilt (恶魔) 于 (Sun Dec 19 15:50:31 2010) 提到: 【 在 bupt070082 的大作中提到: 】 : 利用条件概率的概念p(y|x)=p(xy)/p(x),(rand5(),rand5())可得到x-y平面25个等概率出现的坐标,取其中21个坐标,每三个映射为一个数。此时,p(x)=21/25,p(xy)=3/25,p(y|x)=1/7 : int rand7() : { : ................... 惊现处女贴? ☆─────────────────────────────────────☆ PeterKing (PeterKing) 于 (Sun Dec 19 16:43:52 2010) 提到: 【 在 bupt070082 的大作中提到: 】 : 利用条件概率的概念p(y|x)=p(xy)/p(x),(rand5(),rand5())可得到x-y平面25个等概率出现的坐标,取其中21个坐标,每三个映射为一个数。此时,p(x)=21/25,p(xy)=3/25,p(y|x)=1/7 : int rand7() : { : ................... 王振旺?牛人!! ☆─────────────────────────────────────☆ math (3664.2436498) 于 (Sun Dec 19 18:49:01 2010) 提到: 这么做是对的,但代码写得有点繁琐,这么写就OK了 int rand7() { int r; while((r=(rand5()*5+rand5())/3-1) > 7) ; return r; } 【 在 bupt070082 的大作中提到: 】 : 利用条件概率的概念p(y|x)=p(xy)/p(x),(rand5(),rand5())可得到x-y平面25个等概率出现的坐标,取其中21个坐标,每三个映射为一个数。此时,p(x)=21/25,p(xy)=3/25,p(y|x)=1/7 : int rand7() : { : ................... ☆─────────────────────────────────────☆ math (3664.2436498) 于 (Sun Dec 19 19:02:47 2010) 提到: 此算法也是对的,但先从rand5()过渡到rand2(),平均需耗费1.25次调用rand5(),再从rand2()到rand7()需要3.43次调用,所以平均要4.3次调用rand5()函数,并不是最优的。 【 在 shenlei 的大作中提到: 】 : 你这个俨然不正确... : 这个问题有个很通用的解... : 先构造一个等概率产生0和1的函数... : ................... ☆─────────────────────────────────────☆ buptrh (【ipv6粉丝团】团帐房|emi大婶) 于 (Sun Dec 19 20:27:05 2010) 提到: 借楼再问个题。接到个题目要求到随机数,比如1-5随机吧,但是要严格等概率,用时间得出来的伪随机能算是严格等概率么?或者有其他更好的办法? ☆─────────────────────────────────────☆ renne (歼灭天使 玲) 于 (Sun Dec 19 20:32:36 2010) 提到: 计算机有办法真随机么? 【 在 buptrh (【ipv6粉丝团】团帐房|emi大婶) 的大作中提到: 】 : 借楼再问个题。接到个题目要求到随机数,比如1-5随机吧,但是要严格等概率,用时间得出来的伪随机能算是严格等概率么?或者有其他更好的办法? ☆─────────────────────────────────────☆ buptrh (【ipv6粉丝团】团帐房|emi大婶) 于 (Sun Dec 19 20:44:24 2010) 提到: 不知道,那个题目要求严格等概率,我也不知是不是真的随机。 【 在 renne 的大作中提到: 】 : 计算机有办法真随机么? : 【 在 buptrh (【ipv6粉丝团】团帐房|emi大婶) 的大作中提到: 】 : : 借楼再问个题。接到个题目要求到随机数,比如1-5随机吧,但是要严格等概率,用时间得出来的伪随机能算是严格等概率么?或者有其他更好的办法? : ................... ☆─────────────────────────────────────☆ math (3664.2436498) 于 (Sun Dec 19 20:50:41 2010) 提到: 一般用线性同余法就足够对付很多应用了,用时间一般只是获得初始化种子。如果要通过很多复杂的独立性检验,线性同余法是不够的,可以参考Knuth的论著。如果只要平均分布这种检验,找一个素数做模就能满足要求。 【 在 buptrh 的大作中提到: 】 : 借楼再问个题。接到个题目要求到随机数,比如1-5随机吧,但是要严格等概率,用时间得出来的伪随机能算是严格等概率么?或者有其他更好的办法? : -- ☆─────────────────────────────────────☆ math (3664.2436498) 于 (Sun Dec 19 20:56:48 2010) 提到: 能否真正随机对于应用来说其实不是那么重要,而且计算机算法无论多复杂也只能做到伪随机。最重要的是我们到底在关注什么,只要能通过独立性检验的伪随机函数就是满足我们需要的 ☆─────────────────────────────────────☆ buptrh (【ipv6粉丝团】团帐房|emi大婶) 于 (Sun Dec 19 21:53:43 2010) 提到: 好,谢谢,受教了。明天仔细研究下。 【 在 math 的大作中提到: 】 : 一般用线性同余法就足够对付很多应用了,用时间一般只是获得初始化种子。如果要通过很多复杂的独立性检验,线性同余法是不够的,可以参考Knuth的论著。如果只要平均分布这种检验,找一个素数做模就能满足要求。 : 【 在 buptrh 的大作中提到: 】 : : 借楼再问个题。接到个题目要求到随机数,比如1-5随机吧,但是要严格等概率,用时间得出来的伪随机能算是严格等概率么?或者有其他更好的办法? : ................... ☆─────────────────────────────────────☆ acde (nianqi) 于 (Mon Dec 20 11:00:21 2010) 提到: 太赞了,不过是不是应该是小于8呢? 【 在 math 的大作中提到: 】 : 这么做是对的,但代码写得有点繁琐,这么写就OK了 : int rand7() : { : ................... ☆─────────────────────────────────────☆ math (3664.2436498) 于 (Mon Dec 20 14:40:10 2010) 提到: 小于8就直接return了,大于7才需要继续取。 【 在 acde 的大作中提到: 】 : 太赞了,不过是不是应该是小于8呢? : 【 在 math 的大作中提到: 】 : : 这么做是对的,但代码写得有点繁琐,这么写就OK了 : ................... ☆─────────────────────────────────────☆ lthnainiu (闲步红尘) 于 (Mon Dec 20 23:53:38 2010) 提到: 【 在 shenlei 的大作中提到: 】 : 你这个俨然不正确... : 这个问题有个很通用的解... : 先构造一个等概率产生0和1的函数... : ................... 我想弱弱的问一下 result|=(1<<i); 这个语句代表的是什么意思啊 买没看懂|=和<<符号没理解上去 ☆─────────────────────────────────────☆ siwind (siwind) 于 (Sat Dec 25 11:08:31 2010) 提到: 这个是概率论的问题吧。 随机变量 X 在区间[1,5]上服从均匀分布, 随机变量 Y = (X/5)*7 在区间 [1,7]上服从均匀分布。 so , rand5()*7/5 ☆─────────────────────────────────────☆ siwind (siwind) 于 (Sat Dec 25 11:22:06 2010) 提到: 离散型随机变量 X 在均匀均匀的取值1,2,3,4,5 离散型随机变量 U = [X/2.5](取整)在0,1上均匀取值 随机变量 Y = (U1 + U2 + U3 + U4 + U5 + U6 + U7) 在1-7上均匀取值, 其中U1-U7 和随机变量U同分布。 so , 代码.......... ☆─────────────────────────────────────☆ siwind (siwind) 于 (Sat Dec 25 11:24:32 2010) 提到: U = [X/2.5](取整)在0,1上均匀取值 这个有问题, U不会在 0,1上均匀取值 ☆─────────────────────────────────────☆ siwind (siwind) 于 (Sat Dec 25 12:12:36 2010) 提到: 2L 正解 ☆─────────────────────────────────────☆ siwind (siwind) 于 (Sat Dec 25 12:50:00 2010) 提到: 离散的情况 , 我给个效率更高的算法: int rand7() { int result = 0; for(int i=0;i<2;i++) result = result*5 + rand5() -1; if( result >=21 ) return rand7(); return (result/3) + 1; } ====================================================== 改自19L的代码: int rand7() { int r; while((r=( (rand5()-1)*5+rand5()-1)/3 +1) > 7) ; return r; } ☆─────────────────────────────────────☆ renne (歼灭天使 玲) 于 (Sat Dec 25 12:51:09 2010) 提到: 有人给过了…… 【 在 siwind (siwind) 的大作中提到: 】 : 离散的情况 , 我给个效率更高的算法: : int rand7() : { : ................... ☆─────────────────────────────────────☆ stephenlaw (stephenlaw) 于 (Sat Dec 25 19:55:46 2010) 提到: 连续调用两次Rand5(),生成11代表1,12代表2,13代表3,以此类推,22代表7,剩下的情况排除。 ☆─────────────────────────────────────☆ siwind (siwind) 于 (Sun Dec 26 10:03:22 2010) 提到: nice ☆─────────────────────────────────────☆ arcsinxy (loser) 于 (Sun Dec 26 12:51:27 2010) 提到: 25种可能你排除掉18种,效率太低 【 在 stephenlaw 的大作中提到: 】 : 连续调用两次Rand5(),生成11代表1,12代表2,13代表3,以此类推,22代表7,剩下的情况排除。 : --
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。