iPhone: функция random () каждый раз выдает мне одно и то же случайное число - PullRequest
6 голосов
/ 20 сентября 2009

Я использую функцию random ()% x для генерации случайного числа, но каждый раз, когда я запускаю приложение, я вижу, что оно создает или генерирует одно и то же число.

Как будто я размещаю некоторые изображения случайным образом на основе этого случайного числа, и я вижу, что все изображения размещены в одном месте независимо от того, сколько раз я запускаю приложение.

Ответы [ 8 ]

16 голосов
/ 20 сентября 2009

Вероятно, вам повезет больше с arc4random(), вам не нужно явно его заполнять, и это кажется "лучшей" случайностью.

15 голосов
/ 24 декабря 2009

Обязательный XKCD комикс :

alt text

14 голосов
/ 20 сентября 2009

В вашей заявке делегат:

- (void) applicationDidFinishLaunching:(UIApplication *)application 
{
    srandom(time(NULL));

    // ...

    for (int i = 0; i < 100; i++) {
      NSLog(@"%d", random());
    }
}

Причина, по которой это работает, заключается в том, что для генераторов псевдослучайных чисел требуется начальное значение или seed . Используя время, вы с большей вероятностью будете получать разные последовательности «случайных» чисел при каждом выполнении.

Если вы не укажете начальное значение, одно и то же начальное число используется при каждом выполнении, что приводит к одинаковой последовательности. Это обычно нежелательное поведение, но в некоторых случаях полезно иметь возможность генерировать ту же последовательность, например, для тестирования алгоритмов.

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

4 голосов
/ 24 декабря 2009

arc4random будет лучшим решением, чем rand () или random (). Смотрите это .

4 голосов
/ 20 сентября 2009

Для новичков, которые сталкиваются с этим сообщением:

Функция random() создает псевдослучайную последовательность . random() way дает вам одну и ту же псевдослучайную последовательность каждый раз, когда вы ее используете. Вам нужно «запустить» последовательность, чтобы выбрать другую начальную точку, чтобы каждый раз, когда вы ее запускаете, она выглядела по-разному. Вы можете использовать системное время для посева (srandom(time(NULL)) или использовать вспомогательную функцию srandomdev().

Для эксперимента попробуйте:

#include "stdio.h"

int main(void) {
    int i;
    for (i = 0; i < 10; i++)
        printf("%d\n", random());

    return 0;
}

Вы всегда получите одну и ту же последовательность, на моем компьютере она дает:

1804289383
846930886
1681692777
1714636915
1957747793
424238335
719885386
1649760492
596516649
1189641421

Больше чтения:

  • Случайная справочная страница для получения дополнительной информации. (Запустите man random из терминала.)
2 голосов
/ 20 сентября 2009

Сначала вызовите srandomdev ().

srandomdev ();
long my_rand = random ();

2 голосов
/ 20 сентября 2009

Не забывайте, что вам нужно заполнить генератор случайных чисел через srandom перед его использованием с изменяющимся значением, таким как текущее время.

0 голосов
/ 21 сентября 2009

Используйте srandom (или эквивалент для выбранной вами функции случайного числа), но также используйте условные обозначения вокруг нее, чтобы при отладке все происходило одинаково. Я также склонен ставить предупреждения NSLog при таких вещах, поэтому я не отправляю код brian-dead.

#if DEBUG==0
srandom(time(NULL));
#else
NSLog(@"Debug build: Random numbers are not random!");
#endif

или

if(!debuggingBuild)
    srandom(time(NULL));
else
    NSLog(@"Debug build: Random numbers are not random!");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...