【问题标题】:Random number with modulus in Objective CObjective C中具有模数的随机数
【发布时间】:2010-06-24 12:06:22
【问题描述】:

我有一个非常基本的随机数函数,它可以从一个范围内生成一个随机数;

即:

// The random is seeded earlier on in the applicationDidFinishLaunching() function
-(NSUInteger)makeRandomNumber:(NSUInteger)minNumber to:(NSUInteger)maxNumber
{
 //NSUInteger i = (NSUInteger)( (random() / (double)RAND_MAX) * y);

 NSUInteger i = (arc4random() % (maxNumber - minNumber)) + minNumber; 
 return i;
}

我想在这个函数中添加一个可选模运算,这样你就只返回某个东西的模数。

我想做这个来为随机的人生成工资,我发现 5 或 0 的工资更具可读性。

我不确定如何设置可选参数或强制随机化继续循环,直到找到可选模值。

另一个问题是,如果找不到模数,有时循环会一直持续下去。

即;

在 0 到 100 之间随机化,并返回一个模数为 5 的值。

编辑:这应该适用于任何范围,无论最小值或最大值是多少。以上数字仅为示例。

【问题讨论】:

  • 用取模运算符计算随机数通常很糟糕。你不能保证你的随机数生成器的低位是随机的。
  • 被注释掉的随机化器是一种更好的随机化方式吗?
  • 我通过一些测试发现该范围不会返回您范围内的 maxNumber。 [代码] NSUInteger i = (arc4random() % (maxNumber - minNumber)) + minNumber; [/code] 例如,如果我在 1 到 10 之间的范围内进行 rand,我不会得到 10,也不会得到 1。如果你想要一个包含 1 和 10(最小值和最大值)的范围,算法需要调整。

标签: objective-c random modulus


【解决方案1】:

ITYM multiple of 5。对于您的示例,您只需生成一个介于 0 和 20 之间的随机值,然后将其乘以 5。

【讨论】:

  • 同意。你比我快 43 秒。
  • -1。这也不会给所有可能的输出提供相等的概率。您将有 0.5% 的机会生成 0、1% 的机会生成数字 1-19,以及 0.5% 的机会生成 20。除非您提供一些代码来修改 OP 的随机数生成器。
  • @Stephen Furlani:我没有说 OP 应该使用他现有的 RNG - 我只是说“生成一个介于 0 和 20 之间的随机值,然后将其乘以 5”。
  • 我以5为例,可能是25、50、10,我想乘法也可以。
  • 还有,怎么做可选参数?
【解决方案2】:

我认为循环足够好:

 NSUInteger i = 0;
 do {
   NSUInteger i = (arc4random() % (maxNumber - minNumber)) + minNumber; 
 } while(i % 5 != 0);

【讨论】:

  • 这是相当低效且不必要的复杂。另外我认为您的终止条件需要是while ((i % 5) != 0) ?
  • 是的,当然,这是我的错。这是 20% 的机会,如果你不经常打电话,效率不会是大问题
  • 这个循环效果很好,但我注意到 Paul R 说它效率低下。我很高兴使用更有效的解决方案。谢谢。
  • 是的,当然,你应该去找 Paul R 的答案。这是一个更好的
【解决方案3】:

整数除法将确保您的数字是roundNumber 的倍数,因为它会在除法中截断小数,然后在乘法中恢复原始四舍五入的数字。

// The random is seeded earlier on in the applicationDidFinishLaunching() function
-(NSUInteger)makeRandomNumber:(NSUInteger)minNumber to:(NSUInteger)maxNumber round:(NSUInteger) roundNumber
{   
 NSUInteger i = (arc4random() % (maxNumber - minNumber)) + minNumber; 
 return (i / roundNumber) * roundNumber;
}

【讨论】:

  • 这不会给所有可能的输出提供相同的概率 - 例如对于上面的示例 (0..100),100 的出现频率将低于其他可能的值。
  • @Paul,嗯,是的。由于您正在四舍五入/截断它们不能均匀分布的值。例如,即使您遵循一个不错的舍入规则 (.5),也只会在值为 0-> .499 时调用 0,而如果值为 0.5->1.4999 时将调用 1。我会指出,您的回答也没有解决这个等概率问题。等概率也不是 OP 的要求。可读性和可选的舍入参数是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 2013-05-12
  • 2023-03-11
  • 2010-12-09
  • 1970-01-01
相关资源
最近更新 更多