每次调用函数时,如何多次调用函数来更改函数内的随机数?

时间:2011-04-17 04:03:53

标签: objective-c c srand

我正在为我的C级制作一个游戏(实际上重新制作一个)并且我有一个产生随机价格的功能。问题是我需要在整个游戏中调用此函数60次,并且每次调用函数时都会将数字重新生成为新函数。是否可以在不结束程序的情况下执行此操作,如果是,那么如何?

到目前为止,我已经为功能编写了一个for循环。但它只打印了相同的功能60次,这是我预计会发生的。

以下是代码:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int Prices(void)
{
            //Random price generator
    int Acid = rand() % 10+ 1;
    int Coke = rand() % 150+ 101;
    int Crack = rand() % 30 + 15;
    int Ecstasy = rand() % 8 + 1;
    int Herion = rand() % 100 + 46;
    int Meth = rand() % 100 + 26;
    int Opium = rand() % 65 + 31;
    int Pills = rand() % 7 + 1;
    int Shrooms = rand() % 30 + 16;
    int Speed = rand() % 45 + 11;
    int Weed = rand() % 20 + 21;

    //Prints the above random prices to the main screen
    printf("PRICE PER UNIT:\n\n");  

    printf("Acid: ""%i\n",Acid);

    printf("Coke: ""%i\n",Coke);

    printf("Crack: ""%i\n",Crack);

    printf("Ecstasy: ""%i\n",Ecstasy);

    printf("Herion: ""%i\n",Herion);

    printf("Meth: ""%i\n",Meth);

    printf("Opium ""%i\n",Opium);

    printf("Pills: ""%i\n", Pills);

    printf("Shrooms: ""%i\n", Shrooms);

    printf("Speed: ""%i\n",Speed);

    printf("Weed: ""%i\n",Weed);

    printf("********************************************************************************\n");

    return Acid && Coke && Crack && Ecstasy && Herion && Meth && Opium && Pills && Shrooms && Speed && Weed;
}

int main(void){
    int Prices(void);
    int i;


    for(i=0; i<60; i++){
        Prices();
    }
}

好吧所以我删除了srand函数,但是我还需要限制这个函数在整个游戏过程中定期调用60次,而不是一次性调用。

2 个答案:

答案 0 :(得分:2)

请勿自行致电srand,请删除此行:

srand((unsigned)time(NULL)); //Uses time as seed for random numbers

你的time()调用只有一秒钟的分辨率,每次循环运行所花费的时间远远少于一秒,结果就是你每次都使用相同的值为随机数生成器播种并产生同一组随机数字。

现代rand()实现负责自己为随机数生成器播种。

大多数随机数生成器实际上是其种子的确定性函数,您的rand()看起来就像是其中之一。 standard指的是rand()生成伪随机整数的原因。

答案 1 :(得分:0)

一种选择是使用静态变量来表示您的种子是否已经设置。此代码段将显示如何执行此操作:

...
static int srand_flag = 0;
if (!srand_flag) {
  srand_flag = 1;
  srand((unsigned)time(NULL));
}
...

这将确保您只调用一次种子,从而不会遇到大多数time()实现为您提供的1秒粒度。

另一种选择是使用(通常是平台特定的)毫秒计时器代替种子。然而,什么函数调用给你高度依赖于平台的功能。在Linux中你不得不搞砸clock_gettime()之类的东西,而在Windows中,你可能会搞砸GetTickCount()之类的东西。

最后一个选项,如果您绝对必须每次都要srand(),请在每次拨打srand()之前延迟一秒钟,以确保每次通话时,计数器值都不同。 (这不是一个好的选择。)