C for循环中与rand()的逻辑混淆
我正在尝试跳过列表插入,所以我使用rand()来确定级别。我知道我需要连续抛硬币,所以我认为如果我打印生成器的测试计数,那么每个连续级别的测试计数应该减少大约50%。不知怎么的,我把逻辑搞乱了,但我没能抓住我的错误。在最后一个级别上,它是~==到它之前的级别,而不是一半 这是我的密码: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++) {
#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