使用rand()来模拟骰子。稍微丢失了

时间:2012-08-02 13:53:34

标签: c

这可能是一个愚蠢的问题,但我真的很难接受这个概念。我正在阅读有关数组和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数学很重要....... 再次感谢!

6 个答案:

答案 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'函数)。