给定功能
int rand1();
返回0或1,概率相等, 实现一个功能
int rand5();
以相同的概率返回0,1,2,3,4,5。
!!!扭!在将其标记为重复之前阅读...
您可以调用rand1()的次数是固定的。你可以决定它是10或20或100,但不是任何数量的rand1()调用。 即rand1()调用的数量有一个上限。 此外,您必须保证rand5()应始终以相同的概率将o返回到5。代码偏向于额外的0和1是不可接受的。
如果您认为编写此类功能是不可能的,那么您可以让我们都知道,为什么不可能。
编辑: 这就是我所拥有的,我认为这还不够
int rand5()
{
bitset<3> b;
b[0] = rand1();
b[1] = rand1();
b[2] = rand1();
int i = b;
if(b >= 6)
return rand5();
return i;
}
答案 0 :(得分:6)
不可能。你不能将2 ^ n均分为6个。
答案 1 :(得分:0)
当人们从[0,1]范围内的随机浮点数生成[0,N]范围内的随机整数时,这就是人们正在做的事情(无论他们是否知道):
// assumed sizeof(unsigned int) == sizeof(float) == 32/CHAR_BIT
// assumed 'float' is IEEE single precision with the mantissa in the
// low bits
unsigned int randN(unsigned int high)
{
union { unsigned int i; float f; } u;
u.i = 0;
for (int j = 0; j < 24; j++)
u.i = u.i*2 + rand1();
// u.f will be in the range [0, 0.5)
// so multiply by twice the desired range
return (unsigned int)floor(u.f * (high * 2));
}
我怀疑这不会产生完美均匀分布,但对于大多数用途来说它已经足够了。