【问题标题】:srand() is not working below initialization of array randomlysrand() 在数组初始化下随机不工作
【发布时间】:2013-05-02 18:33:42
【问题描述】:

在下面,但它总是给我 42 作为 SIZE。我想用 srand(time(NULL)) 随机化 SIZE,但显然它不起作用,因为它低于 SIZE 的随机化。当我尝试在 SIZE 随机化之前添加它时,编译器会对我大喊大叫。你有什么想法可以改正吗?

int i,numberToBeFound;
int SIZE=(rand()%100)+1; // size can be in the range [1 to 100]
int *array2 = (int*) malloc(sizeof(int)*SIZE);

srand(time(NULL));

for(i=0;i<SIZE;i++)     //fill the array with random numbers
    array2[i]=rand()%100; 

【问题讨论】:

  • 调用srand你使用rand()之前。
  • 如果我这样做,它会给我 15 个错误和 9 个警告
  • 我认为他看到的错误是他将 srand 移动到 rand 之上时声明之前的代码。
  • 那是因为编译器不接受混合声明和代码(C89,blech)。先声明所有变量。
  • 如果您使用 C++ 工作,那么在您需要调用 rand() 之前将 srand() 的种子向上移动就可以了。但在 C 语言中,它是在执行代码语句之前声明所有局部变量。

标签: c random srand


【解决方案1】:
int i, numberToBeFound;
int SIZE=0;
int* array2=0;

srand(time(NULL));

SIZE=(rand()%100)+1; // size can be in the range [1 to 100]
array2 = (int*) malloc(sizeof(int)*SIZE);

for(i=0;i<SIZE;i++)     //fill the array with random numbers
    array2[i]=rand()%100;

它是古老的 C(C89 或更早版本)。所以声明你的本地人,然后初始化它们,最后根据需要使用它们。

【讨论】:

  • 这仍然不会随机化 SIZE,因为种子是在 rand 调用之后完成的。
  • 你仍然在srand()之前调用rand()。而且不是 C,而是 C89 [过时、无效、坏]。
  • 这不是问题...问题是他没有打电话给srand()之前他打电话给rand()
  • 不,这是问题所在,只是OP没有说清楚,请参阅他对其他答案的评论。
  • 这是问题所在。它是 C,而不是 C++。我只是忘了移动 srand 播种电话。编辑代码块以反映正确的顺序。声明局部变量,初始化。利用。那是C。
【解决方案2】:

您需要在调用rand() 之前调用srand() 来初始化随机数生成器。

你可以试试srand( time( NULL ) ),它每秒会给你一个不同的结果。如果您需要它比这更多的变量,那么您将必须想出一个更好的方法来播种数字生成器。

int i,numberToBeFound;
int SIZE;
int *array2;

srand( time( NULL ) );

SIZE=(rand()%100)+1; // size can be in the range [1 to 100]
array2 = malloc(sizeof(int)*SIZE);

for(i=0;i<SIZE;i++)     //fill the array with random numbers
    array2[i]=rand()%100; 

PS:你不应该在 C 中转换 malloc() -- 请参阅 this post

【讨论】:

  • 他确实打电话给srand(time(NULL));问题是他调用rand() 来初始化SIZE 之后才这样做。 (您的代码调用srand() 两次,这不是一个好主意。)
  • 啊……啊。一旦我看到他还没有打电话给srand(),我就没有看过去rand() 的电话。 ~lol~ 相应地进行了编辑。
  • 我已经知道我必须在 rand 之前调用 srand 但因为我使用的是 Visual Studio,所以当我将 srand 放在 rand 之前时,编译器不接受它。我问是否有解决方法。
  • 认真的吗?编辑先声明变量,然后调用 srand(),然后初始化变量。我很震惊你不知道该怎么做。
【解决方案3】:

你在评论中说如果你在rand()之前调用srand(),你的编译器不会接受它。

那是因为您的编译器(Microsoft?)正在执行 C89/C90 规则,这些规则不允许声明跟在块中的语句之后。

您可以通过添加新块来解决该限制。粗略的轮廓:

srand(time(NULL));
{
     int size = rand() % 100 + 1;
     /* ... */
}

或者您可以删除sizearray2 的初始化程序,在调用srand() 后用赋值替换它们。就个人而言,我更喜欢尽早初始化变量。

一般来说,您应该在程序中只调用一次srand(),然后再调用rand()。 (这适用于您需要不重复的伪随机数的最一般情况;如果您确实需要可重复的序列,则适合采用不同的策略。)

(如果没有调用srand()rand() 的行为就像你调用了srand(1),并且每次都生成相同的序列。)

(我已将您的变量名称 SIZE 更改为 size;全大写标识符通常用于宏。)

【讨论】:

  • srand 的函数创建作为一种解决方法是天才。谢谢
  • @user1939432:这不是“函数创建”,我只是添加了一个块。从语法上讲,{ 后跟零个或多个声明,而语句后跟 } 是复合语句,它可以出现在语句可以出现作为函数体的任何地方。在 C90 中,声明必须在块中的语句之前;在 C99 及更高版本(以及 C++)中,它们可以混合使用。
【解决方案4】:

为了不总是从rand 获得相同的结果,您需要在对rand 进行任何调用之前使用srand 播种生成器。因此,您只需在调用rand 之前将您的srand 呼叫移动到一个位置。

【讨论】:

    猜你喜欢
    • 2018-10-12
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 2010-09-24
    相关资源
    最近更新 更多