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,我建议你用它们代替。@一些程序员,我一定会检查那些其他随机/伪随机资源。谢谢你的解释,这就是问题所在。非常感谢你。这就更有意义了,我每一次都在播种,而不仅仅是一次。并非每次都是这样,骰子滚得越多,它就不可能越高。这就是问题所在。非常感谢你。这就更有意义了,我每一次都在播种,而不仅仅是一次。并非每次都是这样,掷骰子越多,播种的可能性就越小。