Как бы я вызывал функцию несколько раз, меняя случайные числа внутри функции каждый раз, когда она вызывается? - PullRequest
2 голосов
/ 17 апреля 2011

Я делаю игру для своего класса 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 ]

2 голосов
/ 17 апреля 2011

Не звоните srand, удалите эту строку:

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

Ваш time() вызов имеет разрешение только в одну секунду, и каждый прогон цикла занимает намного меньше, чем одна секунда, в результате вы каждый раз заполняете генератор случайных чисел одним и тем же значением, и это дает одно и то же. набор случайных чисел.

Современные rand() реализации сами заботятся о заполнении генератора случайных чисел.

Большинство генераторов случайных чисел на самом деле являются детерминированными функциями своего начального числа, ваш rand() выглядит так, как будто это один из них. стандарт относится к тому, что rand() генерирует как псевдослучайные целые числа по уважительной причине.

0 голосов
/ 17 апреля 2011

Один из вариантов - использовать статическую переменную, чтобы сигнализировать о том, что ваше семя уже задано.Этот фрагмент покажет, как это сделать:

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

Это гарантирует, что вы вызовете свое семя только один раз и, таким образом, вы не столкнетесь с 1-секундной гранулярностью, которую дает вам большинство реализаций time().

Другим вариантом является использование (обычно для платформы) миллисекундного таймера вместо вашего начального числа.Однако то, что дает вызов функции, сильно зависит от платформы.В Linux вам придется возиться с такими вещами, как clock_gettime(), в то время как в Windows вы, вероятно, возитесь с такими вещами, как GetTickCount().

Последний вариант, если вы абсолютно должны Вызывать srand() каждый раз, это ставить задержку в одну секунду перед каждым вызовом на srand(), чтобы гарантировать, что значение счетчика будет отличаться при каждом вызове. (Это не очень хороший вариант.)

...