iPhone: случайный () функция дает мне то же случайное число каждый раз

Я услышал только хорошие вещи [приблизительно 110] ReSharper. Это идет, мой к - изучает список.

6
задан coneybeare 20 September 2009 в 06:04
поделиться

8 ответов

Скорее всего, вам повезет больше с arc4random () , вам не нужно явно указывать его, и он кажется «лучшим» случайным.

16
ответ дан 8 December 2019 в 02:03
поделиться

В делегате вашего приложения:

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

    // ...

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

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

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

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

14
ответ дан 8 December 2019 в 02:03
поделиться

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

Функция random () создает псевдослучайную последовательность . random () способами дает вам одну и ту же псевдослучайную последовательность каждый раз, когда вы ее используете. Вам нужно «засеять» последовательность, чтобы выбрать другую начальную точку, чтобы при каждом запуске она выглядела по-разному. Вы можете использовать системное время для заполнения (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 из Терминала.)
4
ответ дан 8 December 2019 в 02:03
поделиться

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

2
ответ дан 8 December 2019 в 02:03
поделиться

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

srandomdev ();
long my_rand = random ();

2
ответ дан 8 December 2019 в 02:03
поделиться

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

#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!");
0
ответ дан 8 December 2019 в 02:03
поделиться

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

alt text

15
ответ дан 8 December 2019 в 02:03
поделиться

arc4random будет лучшим решением, чем rand() или random(). See this.

4
ответ дан 8 December 2019 в 02:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: