用C解释抛硬币代码

问题描述

在上课期间,老师介绍了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

感谢您发现我的困惑!