逻辑上与for循环中的rand()混淆

时间:2016-07-20 18:34:06

标签: c for-loop random

我正在尝试跳过列表插入,因此我使用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

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

1 个答案:

答案 0 :(得分:2)

假设我们将其设为i级别。我们提升到下一级的机会是~0.5。这意味着如果我们将其设为i - 级N次,那么〜0.5 * N次我们停在i级并且〜0.5 * N次我们提升到下一级。等效地,我们停止在i ~0.5 * N级,并且所有其他级别值的 sum 也是~0.5 * N.因此,无论有多少总水平,最后两个级别的值都相似。

预期X,X / 2,X / 4,X / 8,X / 16,X / 16的序列。如果你想要最后一个成员是X / 32,只需添加人工水平。