Где найти srandom (time(null))

Я использую функцию random()%some integer в методе одного из классов моего приложения, и я понятия не имею, куда поместить srandom (время (NULL)) для генерации не псевдослучайных, а настоящих случайных чисел. Я уже поставил его в viewDidLoad и viewWillAppear, но это не помогает.

- (NSMutableDictionary *)getUsersFromServer
{
      srand(time(NULL));
      //here we're getting list of users from the server
      NSMutableDictionary * users = [[[NSMutableDictionary alloc] init] autorelease];

     for (int i = 0;i < 19;i++)
     {
      int wins    = rand()%100; float f_wins = (float)wins;
       int losses  = rand()%100;     float f_losses = (float)losses;
      int withdr  = rand()%100;         float f_withdr = (float)withdr;
      float win_per = f_wins / ((f_wins + f_losses + f_withdr) / 100.0);

      [userresults setArray:[NSMutableArray arrayWithObjects:[NSNumber numberWithInt:wins],
                                                   [NSNumber numberWithInt:losses],
                                                                                [NSNumber numberWithInt:withdr],
                                                                                [    NSNumber numberWithFloat:win_per],
                                                                                 nil]]; 
          [users setObject:userresults forKey:[NSString stringWithFormat:@"Pfeffer ID %i",i]];
   }

    [userresults release];
     return users;
}

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


person Andrey Chernukha    schedule 11.11.2011    source источник
comment
Ошибаетесь, это не делает псевдослучайные числа настоящими случайными числами, srandom, srand и т. д. просто устанавливает начальное состояние или начальное состояние, генератора псевдослучайных чисел. Обычно начальное значение устанавливается один раз (до использования rand/random) и желательно не на основе тиков напрямую... Я не уверен, какие рекомендации существуют для IOS в противном случае.   -  person    schedule 11.11.2011
comment
ок, неважно, IOS это или что-то еще. где srand(time(NULL)) должен быть написан для просмотра rand() в методе класса?   -  person Andrey Chernukha    schedule 11.11.2011
comment
FWIW, arc4random было рекомендовано в этом сообщении, касающемся IOS.   -  person    schedule 11.11.2011
comment
да. Убедитесь, что srand действительно вызывается (сначала) и что он не вызывается повторно (что может нарушить внутреннее состояние). Кроме того, обязательно используйте srand/rand или srandom/random в качестве пары.   -  person    schedule 11.11.2011
comment
я знаю, я уже пробовал, он тоже сгенерировал тот же номер, к сожалению   -  person Andrey Chernukha    schedule 11.11.2011
comment
Почтовый индекс тогда. Потому что то, что вы видите, не должно происходить из всего, что обсуждалось выше. Также найдите время, чтобы убедиться, что семя действительно отличается.   -  person    schedule 11.11.2011
comment
@Андрей Чернуха rand() работает нормально. Что значит ничего не работает? В любом случае вызовите srand() один раз при запуске программы. Вызывать его в начале функции довольно бессмысленно.   -  person nos    schedule 11.11.2011


Ответы (1)


Я не думаю, что это проблема случайности или семян, я не использую Objective-C, но...

// for each loop iteration:
  [userresults setArray: .... ]      // <-- modify object known as userresults?
  [users setObject:userresults ....] // <-- isn't that the SAME userresults object?

То есть я полагаю, что у вас есть один и тот же объект несколько раз в users: не должен ли новый объект результата создаваться на каждой итерации?

Кроме того, см. srand() — зачем вызывать его только один раз? — зачем использовать srand в верхней части этого метода может быть не идеальным. В качестве альтернативы в этом сообщении рекомендуется arc4random, так как он не требует ручного заполнения и является " сильный" псевдослучайный генератор.

Удачного кодирования.

person Community    schedule 11.11.2011