我正在尝试跳过列表插入,因此我使用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
我有点期待我的错误是愚蠢的,但我现在已经看了一段时间,似乎无法抓住它。
答案 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,只需添加人工水平。