这可能是一个愚蠢的问题,但我真的很难接受这个概念。我正在阅读有关数组和rand()函数的教程。我有两个问题。
首先,显然是要模拟一个骰子,我们需要从1-6中随机生成一个数字。这本书暗示了这一点:
int RollOne( void ) {
return (rand() % 6) + 1;
}
是的,好的rand()可以生成0-32767之间的任何数字。然后我们找到这个数字的剩余部分除以6,然后加1。 3245是随机生成的。我们将它除以6,给出540.8333并取其余部分。 8.333(截断到8我相信)然后加1.除非我发疯,否则9,这不是1-6之间。该程序运行正常但我无法理解我们如何使用该代码从1-6获得数字!任何帮助将不胜感激。
我遇到的第二个问题并不是那么重要,而是相关的。这本书遗漏了这段代码的含义:
srand( clock() );
所有提到的是srand()使用clock()提供的种子初始化随机数生成器。是的,现在我们可以将任何东西输入到clock()中,如果是这样,它的影响是什么?稍微解释一下srand(clock())的作用就是完美的。
对不起,我希望你不介意墙上的文字。任何帮助都会非常感激。
谢谢, 麦克
ANSWERED 的 谢谢大家:我意识到我在做什么。如你们所示,%运算符不分,它只是找到最高倍数和操作数之间的差异。得到它了!我的印象是剩下的意思是小数。即如果7/2 = 3.5,则余数为0.5。既然我已经把它写出来了,我看到我一直都是多么愚蠢。很高兴我的A-level数学很重要....... 再次感谢!
答案 0 :(得分:8)
您的示例稍有不正确:
如果你随机生成3245,将其除以6得到540.8333(因为整数数学实际得到540)。其余为3245-6 * 540,其为5. 5 + 1为6:D
答案 1 :(得分:4)
rand(clock())如何运作
种子只是一个开始工作的数字。
在计算机中实际上没有随机的东西(只是随机性的假象),一切都是涉及种子的复杂计算/转换,你只需要一个从系统时钟开始的(种子)开始的数字在这种情况下,因为它总是在变化,应该始终提供类似随机的结果。
您可以在系统时钟值的任何位置放置您想要的任何值。只是不要指望发生良好的随机性。
同样,通常使用clock(),因为它是一个不断变化的值。
想想看,你应该永远不会有两次来自系统时钟的相同值。总是有一些时间的推移,差异可能是毫秒或更短,但即使变化可能很小,也是一个不同于纳秒之前的时间。
答案 2 :(得分:4)
随机生成3245。我们将它除以6,给出540.8333和 拿剩下的。
您在整数截断和余数之间感到困惑。当使用整数数学将3245除以6时,余数为5(或0.83333 * 6 = 5)。
另一种看待这种情况的方法是540 * 6 = 3240,剩下5分。
答案 3 :(得分:1)
对于第二个问题,srand用于为随机数生成器播种。如果没有一些专门的硬件,计算机无法真正生成真正的随机数,所以我们所做的就是使用像Linear congruential generator这样的数学函数(许多C标准库用作默认算法)或Mersenne Twister产生一系列高度不可预测的数字,这个数学函数必须被种子化以赋予它第一个“随机”值。一个好的种子值对于程序的每次运行都是不同的,只要你不在同一秒内运行两次相同的程序,时间就是好的。你需要种子的原因是因为伪随机数函数不是真正随机的,如果给函数提供相同的种子,函数每次都会返回完全相同的数字序列(这对某些类型的模拟很有用,但大多数时候你希望每次跑步都不同。)
练习:
运行此程序:
#include <stdio.h> int main() { srand(1234); for (int i=0; i < 20; i++) printf("%d ", rand()); printf("\n"); }
几次,观察发生了什么,然后用1234替换 时间(NULL)并观察会发生什么。编写一个运行的shell脚本 修改过的程序很快很快,并观察了什么 发生的情况。
答案 4 :(得分:0)
剩下的8怎么样?当然这意味着6会再次进入它吗? %也不是除法函数,它是不同的div函数。
答案 5 :(得分:0)
百分比不分。它给出了余数('mod'函数)。