随机数字列表

Random list of numbers

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <math.h>

int main()
{
   int i;
   int diceRoll;

   for(i=0; i < 20; i++)
   {
       printf("%d \n", rand());
   }

    return 0;
}

这是我用 c (codeblocks) 编写的用于获取随机数的代码,问题是我总是得到相同的序列:41,18467,6334,26500 等...

我还在学习,所以请试着像你在和一个 8 岁的 D 说话一样解释:

您每次都得到相同的序列,因为未设置随机数生成器的种子。您需要这样调用 srand(time(NULL))

int main()
{
    srand(time(NULL));
    ....

首先,通过包含 <ctime> 并调用 srand(time(NULL));.

为您的随机函数设定种子

其次,如果要调用 rand(),则需要模数,例如:rand() % x 将 return 一个从 0 到 x-1 的随机数。由于您正在模拟掷骰子,因此请执行 rand() % 6 + 1.

随机数生成器是伪随机的。这意味着他们使用一些 "algorithm" 来得出下一个 "random" 数字。换句话说,如果你从这个算法的相同种子开始,你每次都会得到相同的随机数序列。要解决这个问题,您必须确保为随机数生成器播种。有时,最好使用相同的种子,这样您就可以推断出程序的逻辑是否正确。无论哪种方式,人们为他们的程序播种的一种常见方式是使用 time(NULL)。 time 给出自纪元时间以来经过的时间(以秒为单位)。这意味着这个函数每秒都在变化。因此,如果您在程序开始时使用 (srand(time(NULL)) 为您的随机数生成器播种,您将每隔一秒获得一个不同的随机数序列 运行 您的程序。一定不要为您请求的每个随机数播种。只需在代码的开头执行一次,然后就不要管它了。

你的标题说的是 C#,但我用 C++ 回答了。为此,您需要包括 ctime。查看随机数生成的新样式也可能是有益的,因为现在 rand() 不是很随机。查看 #include random 并使自己成为一个引擎和分布来提取随机数。别忘了在那里播种!

srand((unsigned)(time(NULL)) 必须在循环之外,此行必须在您的代码中只有一次。

取模 rand()%10 意味着您可以得到从 0 开始的任何数字,直到您被 -1 取模。所以在这种情况下 0-9,如果你想要 1-10,你可以这样做:rand()%10 + 1

int main()
{  
    int i;
    int diceRoll;

    srand((unsigned)(time(NULL));

    for(i=0; i < 20; i++)
    {
        printf("%d \n", rand() % 10); //Gets you numbers 0-9
    }

    return 0;
}