C++:当掷骰子的数目为偶数时,为什么掷骰子函数只返回偶数整数?

C++:当掷骰子的数目为偶数时,为什么掷骰子函数只返回偶数整数?,c++,random,C++,Random,根据我读到的一些文章,我创建了掷骰子函数,如下所示: #include <iostream> #include <cstdlib> #include <ctime> using std::cout; short roll_dice(short number_of_dice, short die_strength) { short all_rolls_sum = 0; short individual_roll = 0; for

根据我读到的一些文章,我创建了掷骰子函数,如下所示:

#include <iostream>
#include <cstdlib>
#include <ctime>

using std::cout;

short roll_dice(short number_of_dice, short die_strength) {
    short all_rolls_sum = 0;
    short individual_roll = 0;  
    for (short i = number_of_dice; i > 0; i--) {
        srand(time(NULL));
        individual_roll = (rand() % die_strength) +1;
        all_rolls_sum += individual_roll;
    }
    return all_rolls_sum;
}
我用来运行此函数的程序是:

int main() {
    cout << roll_dice(1, 6);
    return 0;
}
这是为了模拟1d6模具辊。结果是我所期望的,即2、4、3、5、6、4、4、1同时返回奇数和偶数。然而,问题是,当我为第一个参数输入2时,只返回偶数,即2、2、6、8、6、4、4、8。结果是,每当我输入一个奇数作为\u骰子的第一个参数,我都会返回偶数和奇数。如果我为骰子的数量输入一个偶数,我只得到偶数


我对C++/编程还是比较陌生,但这是不是我代码中rand%die_strength+1部分使用的模的问题?

正如@Eljay所指出的,您每次调用srand一次

由于timeNULL的分辨率为1秒,并且函数很可能在同一秒内运行,因此您得到的输出是相同的,这意味着单个_roll最终是相同的数字

因此,您最终得到了以下关系:

all_rolls_sum = number_of_dice * individual_roll

如果骰子的数量是2,那么你的数字都是偶数。

正如@Eljay所指出的,你每掷一个骰子就要打一次srand

由于timeNULL的分辨率为1秒,并且函数很可能在同一秒内运行,因此您得到的输出是相同的,这意味着单个_roll最终是相同的数字

因此,您最终得到了以下关系:

all_rolls_sum = number_of_dice * individual_roll

如果骰子的数量是2,那么你的数字都是偶数。

你在每次掷骰时都将种子设置为相同的值,因此你的掷骰在大多数情况下应该是相同的

在开始滚动之前,试着只放置一次种子

下面是100卷

#include <iostream>
#include <cstdlib>
#include <ctime>

using std::cout;

short roll_dice(short number_of_dice, short die_strength) {
    short all_rolls_sum = 0;
    short individual_roll = 0;  
    for (short i = number_of_dice; i > 0; i--) {
        individual_roll = (rand() % die_strength) +1;
        all_rolls_sum += individual_roll;
    }
    return all_rolls_sum;
}

int main() {
    srand(time(NULL));
    for (int i = 0; i < 100; i++) {
        cout << roll_dice(1, 6);
    }
    return 0;
}

你在每卷中都将种子设置为相同的值,因此你的卷在大多数情况下都应该是相同的

在开始滚动之前,试着只放置一次种子

下面是100卷

#include <iostream>
#include <cstdlib>
#include <ctime>

using std::cout;

short roll_dice(short number_of_dice, short die_strength) {
    short all_rolls_sum = 0;
    short individual_roll = 0;  
    for (short i = number_of_dice; i > 0; i--) {
        individual_roll = (rand() % die_strength) +1;
        all_rolls_sum += individual_roll;
    }
    return all_rolls_sum;
}

int main() {
    srand(time(NULL));
    for (int i = 0; i < 100; i++) {
        cout << roll_dice(1, 6);
    }
    return 0;
}

为什么您的代码多次调用srand?@Dortimer What decimal?@Eljay它只使用一次,rand也只使用一次。time函数的分辨率通常只有1秒,这意味着如果您在同一秒内多次调用timeNULL,您将返回相同的值。现在,如果您在一秒钟内多次迭代的紧密循环中使用此作为srand的种子,那么您将重置种子,使rand一次又一次地返回相同的值。C++有一些非常好的工具来代替Srand和Rand,我建议你用它们代替。@一些程序员,我一定会检查那些其他随机/伪随机资源。感谢您的解释。为什么您的代码多次调用srand?@Dortimer What decimal?@Eljay它只使用一次,rand也只使用一次。time函数的分辨率通常只有1秒,这意味着如果您在同一秒内多次调用timeNULL,您将返回相同的值。现在,如果您在一秒钟内多次迭代的紧密循环中使用此作为srand的种子,那么您将重置种子,使rand一次又一次地返回相同的值。C++有一些非常好的工具来代替Srand和Rand,我建议你用它们代替。@一些程序员,我一定会检查那些其他随机/伪随机资源。谢谢你的解释,这就是问题所在。非常感谢你。这就更有意义了,我每一次都在播种,而不仅仅是一次。并非每次都是这样,骰子滚得越多,它就不可能越高。这就是问题所在。非常感谢你。这就更有意义了,我每一次都在播种,而不仅仅是一次。并非每次都是这样,掷骰子越多,播种的可能性就越小。