问题描述
在上课期间,老师介绍了C代码来模拟抛硬币。我知道已经回答了许多有关此主题的问题,但是,没有一个问题与我的问题完全相关。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define TOSS 50
int randof(int n) {
return rand() / (RAND_MAX + 1.0) * n;
}
int main(void) {
srand((unsigned) time(NULL));
for (int i = 0; i < TOSS; ++i) {
printf("%d",randof(2));
}
printf("\n");
return 0;
}
这是我不理解的部分:
return rand() / (RAND_MAX + 1.0) * n;
正如我打印出来的那样,每个掷骰子的结果仅为01010101111...。但是,在比较rand()
和(RAND_MAX + 1.0) * n
的值时(我将代码更改为:)
int r = rand();
printf("|%d %d ",r,RAND_MAX);
return r / (RAND_MAX + 1.0) * n;
对于我检查的示例,r / (RAND_MAX + 1.0) * n;
的值小于0.5,因此我不知道如何将其舍入为0或1。
解决方法
感谢@Yunnosch指出了我的错误,我意识到自己已经看到了:
r / ((RAND_MAX + 1.0) * n)
代替:
(r / (RAND_MAX + 1.0)) * n
感谢您发现我的困惑!