我正在尝试跳过列表插入,所以我使用rand()来确定级别我知道我需要做连续的硬币翻转,所以我想如果我为生成器打印测试计数,它应该有大约50%减少每个连续的水平。我不知怎么搞砸了逻辑,但我没能理解我的错误在最后一级,它是~==到它之前的水平,而不是一半。
这是我的代码:

#define MAXLEVEL 5
srand(time(NULL));
int newLevel;
int a[6] = {0};
for (int i = 0; i < 100000; i++) {
    for (newLevel = 0; (rand() < RAND_MAX/2) && (newLevel < MAXLEVEL); newLevel++);
    a[newLevel]++;
}
printf("0: %d   1: %d   2: %d   3: %d   4: %d   5: %d\n", a[0], a[1], a[2], a[3], a[4], a[5]);

结果如下:
0: 50018   1: 24969   2: 12532   3: 6334   4: 3094   5: 3053

我有点期待我的错误是愚蠢的,但我已经看了一段时间,似乎无法抓住它。

最佳答案

假设我们使它达到了i级别我们晋升到下一级的机会是~0.5这意味着,如果我们把它提升到i-th级N次,那么~0.5*N次我们就停在i级,而~0.5*N次我们就提升到下一级等价地,我们在i~0.5*N层停止,并且所有进一步的层值之和也为~0.5*N。因此,无论总共有多少层,最后两个层都具有相似的值。
应为X、X/2、X/4、X/8、X/16、X/16的顺序如果希望最后一个成员是X/32,只需添加人工级别。

10-02 03:10