【问题标题】:Where to locate srandom (time(null))在哪里找到 srandom (time(null))
【发布时间】:2011-11-11 17:43:53
【问题描述】:

我在我的应用程序类之一的方法中使用函数 random()%some integer,我不知道在哪里放置 srandom (time (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() 它什么都不会改变。还是一样的数字

【问题讨论】:

  • 错误,它不是在制作“伪随机数真正的随机数”,srandomsrand 等只是设置种子或初始状态of a pseudo random number generator。通常种子设置一次(在使用rand/random 之前),并且最好不要直接基于刻度......我不确定IOS有什么建议。
  • ok 不管是IOS还是别的什么的。 srand(time(NULL)) 应该写在哪里让 rand() 在类方法中看到?
  • FWIW, arc4random 被推荐 in this post 与 IOS 相关。
  • 是的。确保确实(首先)调用了srand,并且没有重复调用它(这可能会破坏内部状态)。另外,请确保将srand/randsrandom/random 配对使用。
  • 我知道,我已经试过了,它也产生了同样的数字,不幸的是

标签: iphone objective-c xcode4 srand


【解决方案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() — why call it only once? - 了解为什么在此方法的顶部使用 srand 可能并不理想。或者,this post recommends arc4random 因为它不需要手动播种并且是“更强”的伪随机生成器。

编码愉快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 2011-08-22
    • 2014-12-14
    相关资源
    最近更新 更多