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

C for循环中与rand()的逻辑混淆,c,for-loop,random,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++) {

我正在尝试跳过列表插入,所以我使用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]);

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

假设我们到达了
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,只需添加人工级别。

newLevel Hmmm,我的书实际上有
您将获得中止陷阱,因为您正在注销数组的末尾。将
inta[6]
更改为
inta[7]
如果要使用
newlevel My bad,我没有注意到for循环中有分号。不过我只希望有[0:5]个级别。我可以通过使用
来伪装它。老实说,我很难理解这一点。我不明白你关于进一步等级总和的观点,或者为什么
I
th等级不同于
I-1
th等级。此外,这是否意味着使用此代码进行级别确定的跳过列表实际上是错误的?我的观点是,上述算法在最后两个级别上会产生类似的值。不管是对是错,我不看你们的书就回答不了。但我的猜测是,这个跳过列表应该只有5个真实级别,0到4。第五级是人工的。
0: 50018   1: 24969   2: 12532   3: 6334   4: 3094   5: 3053