Algorithm 写一个C++;程序生成0到5之间的随机分布,给定随机返回0或1的rand1()

Algorithm 写一个C++;程序生成0到5之间的随机分布,给定随机返回0或1的rand1(),algorithm,probability,Algorithm,Probability,给定函数 int rand1(); 返回0或1的概率相等, 实现一项功能 int rand5(); 它以相等的概率返回0,1,2,3,4,5 !!!扭曲在将其标记为副本之前阅读 您可以调用rand1()的次数是固定的。您可以将其设置为10、20或100,但不能设置任意数量的rand1()调用。 i、 e.rand1()调用的数量有上限。 您还必须保证rand5()总是以相同的概率返回o到5。代码向少数额外的0和1倾斜是不可接受的 如果你认为写这样的函数是不可能的,那么你可以告诉我们为什么不可

给定函数

int rand1();
返回0或1的概率相等, 实现一项功能

int rand5();
它以相等的概率返回0,1,2,3,4,5

!!!扭曲在将其标记为副本之前阅读

您可以调用rand1()的次数是固定的。您可以将其设置为10、20或100,但不能设置任意数量的rand1()调用。 i、 e.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;
}
int rand5()
{
位集b;
b[0]=rand1();
b[1]=rand1();
b[2]=rand1();
int i=b;
如果(b>=6)
返回rand5();
返回i;
}

不可能。你不能将2^n平均分为6。

当人们从[0,1]范围内的随机浮点数生成[0,n]范围内的随机整数时,这就是人们正在做的事情(无论他们是否知道):

//假定sizeof(unsigned int)==sizeof(float)==32/CHAR\u位
//假设“float”是IEEE单精度,尾数在
//低位
无符号整数随机数(无符号整数高)
{
并集{无符号整数i;浮点f;}u;
u、 i=0;
对于(int j=0;j<24;j++)
u、 i=u.i*2+rand1();
//u.f将在[0,0.5]范围内
//所以乘以所需范围的两倍
返回(未签名整数)楼层(u.f*(高*2));
}

<> P>我怀疑这并不能产生一个完全一致的分布,但它对大多数目的来说都是足够好的。

这和C++或C有什么关系?你必须用C++或某种语言编写代码。如果我说你不必编写代码,那么问题就将关闭,而不是与编程有关。有很多人在等待T。帽子。但事实是我必须实现这段代码(在C++中),以实现同样的功能。我有一个次优解决方案,对rand1()的调用没有固定的上限,我正在搜索没有限制的实现。??听起来像是家庭作业。请加上“家庭作业”一词到标题,并显示到目前为止你有什么。解释你的问题是什么。@Tomalak:我没有把家庭作业标记放在上面。:(Jared Ng这样做了。但是感谢Tomalak.:)。这是必需的,因为对
rand1()的固定调用
。否则,您可以生成3位,只需丢弃任何6位和7位结果并重新滚动。到目前为止,我的结论也是如此。但问题是我无法知道这是确定的。可能还有其他方法生成此分发。当然,还有其他方法生成分发。它们与修复程序不兼容对rand1()的ed调用数这大致相当于将一个随机n位数模6,并接受发生的轻微偏差,因为2^*n*不能被6整除。n越大,错误越小。使用
float
只是稍微混淆了这一点。耶。我使用
float
是因为,正如我所说,生成随机整数是很常见的r在
[0,N)
中来自一个RNG原语,该原语通过这种方法在
[0,1)
中生成一个随机浮点数,接受任何偏差。我有点好奇偏差最终会是什么样子,但没有足够的好奇来实际计算。
// 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));
}