0

アプリのクラスの1つのメソッドで関数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()を使用しても、何も変更されません。まだ同じ数

4

1 に答える 1

2

これはランダム性やシードの問題ではないと思います.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() も参照してください — なぜ 1 回だけ呼び出すのですか? srand--このメソッドの先頭での使用が理想的ではない理由について。別の方法として、この投稿では、arc4randomを推奨しています。これは、手動のシードを必要とせず、「より強力な」疑似乱数ジェネレーターであるためです。

ハッピーコーディング。

于 2011-11-11T18:16:13.110 に答える