给出一个C ++程序,在0到5之间产生随机分布,给定rand1()随机返回0或1

时间:2011-08-19 21:36:57

标签: algorithm probability

给定功能

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;
}

2 个答案:

答案 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));
}

我怀疑这不会产生完美均匀分布,但对于大多数用途来说它已经足够了。