h*******n 发帖数: 22 | 1 Given function f1 that can generate integer 0 and 1 randomly, how to use f1
to build another function f2 that can generate integer between 0 and 29
randomly? |
n******7 发帖数: 12463 | 2 while (true) {
int a = f1()+2*f1()+4*f1()+8*f1()+16*f1();
if (a < 30) return a;
} |
h*******n 发帖数: 22 | 3 Given function f1 that can generate integer 0 and 1 randomly, how to use f1
to build another function f2 that can generate integer between 0 and 29
randomly? |
n******7 发帖数: 12463 | 4 while (true) {
int a = f1()+2*f1()+4*f1()+8*f1()+16*f1();
if (a < 30) return a;
} |
i****k 发帖数: 668 | 5 不好,建议用shift
int a = f1()+2*f1()+4*f1()+8*f1()+16*f1();
while(a >=30) {
a = ((a<<1) | f1())&0x1f;
}
return a;
【在 n******7 的大作中提到】 : while (true) { : int a = f1()+2*f1()+4*f1()+8*f1()+16*f1(); : if (a < 30) return a; : }
|
n******7 发帖数: 12463 | 6 好在哪里?
可以节省很少的运算时间?
另外我感觉这样的结果不是uniform 分布的
【在 i****k 的大作中提到】 : 不好,建议用shift : int a = f1()+2*f1()+4*f1()+8*f1()+16*f1(); : while(a >=30) { : a = ((a<<1) | f1())&0x1f; : } : return a;
|
v********e 发帖数: 1985 | 7 int a=0;
for(i=0;i<32;i++) {
a=a<<1 & f1();
}
return a % 30; |
n*****t 发帖数: 22014 | 8 貌似也不太严谨啊
【在 v********e 的大作中提到】 : int a=0; : for(i=0;i<32;i++) { : a=a<<1 & f1(); : } : return a % 30;
|
k*******n 发帖数: 190 | |
w********m 发帖数: 1137 | |
|
|
n*****t 发帖数: 22014 | 11 去掉 2*f1
【在 w********m 的大作中提到】 : nowhere的是标准答案了吧
|
a9 发帖数: 21638 | 12 打回去
【在 k*******n 的大作中提到】 : F2 =floor(f1*29+0.5)
|
l*****n 发帖数: 1648 | 13 for (i=0;i<29;i++) a+=f1()
f1
【在 h*******n 的大作中提到】 : Given function f1 that can generate integer 0 and 1 randomly, how to use f1 : to build another function f2 that can generate integer between 0 and 29 : randomly?
|
k*******n 发帖数: 190 | 14 有什么问题吗
【在 a9 的大作中提到】 : 打回去
|
n******7 发帖数: 12463 | 15 这结果是binomial distribution B(29,0.5)
【在 l*****n 的大作中提到】 : for (i=0;i<29;i++) a+=f1() : : f1
|
n******7 发帖数: 12463 | 16 我知道你想-2,这样range正好在29以内
但是这样就不是uniformly distributed的
起码,你没办法产生2,3
【在 n*****t 的大作中提到】 : 去掉 2*f1
|
n*****t 发帖数: 22014 | 17 对对对,有道理,疏忽了。sum * 29/32 是不是好点?
【在 n******7 的大作中提到】 : 我知道你想-2,这样range正好在29以内 : 但是这样就不是uniformly distributed的 : 起码,你没办法产生2,3
|
n******7 发帖数: 12463 | 18 把32个数挤到30个格子里面
还是不对啊
【在 n*****t 的大作中提到】 : 对对对,有道理,疏忽了。sum * 29/32 是不是好点?
|
n*****t 发帖数: 22014 | 19 float 运算的话没问题吧,迷糊了,这不是常规取 random 的方法吗?
【在 n******7 的大作中提到】 : 把32个数挤到30个格子里面 : 还是不对啊
|
l*****n 发帖数: 1648 | 20 我猜是有些数会被挤压到一起,这样概率增高就不是随机数了。 比如7,8,9,10
【在 n*****t 的大作中提到】 : float 运算的话没问题吧,迷糊了,这不是常规取 random 的方法吗?
|
|
|
n******7 发帖数: 12463 | 21 我们处理的是整数啊 离散的不是连续的 你最后还是要map成0-29的整数吧
【在 n*****t 的大作中提到】 : float 运算的话没问题吧,迷糊了,这不是常规取 random 的方法吗?
|
z*y 发帖数: 1311 | 22
一点起码的数学常识都没有
【在 l*****n 的大作中提到】 : for (i=0;i<29;i++) a+=f1() : : f1
|
j*a 发帖数: 14423 | 23 为啥是&不是|?
【在 v********e 的大作中提到】 : int a=0; : for(i=0;i<32;i++) { : a=a<<1 & f1(); : } : return a % 30;
|