【问题标题】:Random number picker always picks same number only when app is first launched随机数选择器仅在首次启动应用程序时始终选择相同的数字
【发布时间】:2013-01-04 19:11:57
【问题描述】:

我正在使用生成一个随机数字符串

int rNumber = rand() %100000000 + 1;
_certificateReferenceField.text = [[NSString alloc] initWithFormat: @"C/R %d", rNumber];

当应用程序首次启动或来自后台时,它最初总是选择相同的数字c/R16808?再按一次没问题,一切正常。

【问题讨论】:

  • 是的,它发生了。您可以生成具有日期和时间组合的随机数。
  • 一种选择是播种 rand() 函数,但更好的是使用arc4random()
  • @Watson 只是想知道,为什么 arc4random 更好,仅供参考?
  • @JSA986:因为它在第一次使用时会自行播种。

标签: objective-c ios cocoa-touch


【解决方案1】:

rand() 不是一个好的随机数生成器,这样做

NSInteger rNumber = arc4random() % 100000000 + 1;

【讨论】:

  • rand 没有任何问题。有些人会争辩说arc4random 太过分了。这取决于需求。
  • 你是对的,视情况而定,rand 的一个弱点是除非你每次都播种它,否则重复调用 rand() 生成的数字序列将很容易预测。
  • 但 arc4random() 在每次运行中仍然为您提供相同的值。
  • @AnoopVaidya 这根本不正确。每次调用 arc4random() 时都会自行播种。
  • @KaanDedeoglu 不,您只在应用启动时调用一次srand。不是每次拨打rand。我只是进行了一些测试。 arc4randomrand 慢 3 倍。
【解决方案2】:

您需要使用srand 为随机数生成器播种。一个常见的用法是:

srand(time(NULL));

在调用rand之前先调用它。

【讨论】:

  • tnaks Maddy 但 srand(time(NULL)); int rNumber = rand() %100000000 + 1; _certificateReferenceField.text = [[NSString alloc] initWithFormat: @"C/R %d", rNumber];最初出于某种原因仍然给 sme 1608
  • 为什么不srandomdev(void);
  • @JSA986 当我在应用启动时使用srand 时,每次调用rand 都会在每次运行应用时给我一个不同的号码。
  • 我会在 main 或您的应用代理的 init 方法中调用 srand
  • Maddy 我在didFinishLaunchingWithOption 得到了它,如果那是正确的?所以我的想法是正确的,在使用srand(time(NULL)); 随机化之前总是将初始字符串设置为零
【解决方案3】:

你可以使用

srandom(time(NULL));

随机生成随机数。

然后使用random()生成随机数。

【讨论】:

  • srandom 用于播种random,而不是rand
猜你喜欢
  • 2019-03-18
  • 2012-10-22
  • 2015-08-17
  • 1970-01-01
  • 2020-08-28
  • 2011-12-28
  • 2019-06-03
  • 1970-01-01
  • 2014-05-06
相关资源
最近更新 更多