Objective C - 随机结果为1或-1

时间:2009-08-31 21:38:34

标签: objective-c random

我正在尝试随机生成正数或负数,而不是担心我希望随机生成1或-1的更大范围,只是乘以我的其他随机数。

我知道这可以用更长的生成0或1的规则来完成,然后检查返回并使用它来乘以1或-1。

希望有人知道在数字上随机设置符号的简单方法。尽量保持我的代码尽可能干净。

6 个答案:

答案 0 :(得分:22)

我喜欢使用arc4random(),因为它不需要您为随机数生成器播种。它也方便地返回一个uint_32_t,所以你不必担心结果介于0和1之间,等等。它只会给你一个随机整数。

int myRandom() {
  return (arc4random() % 2 ? 1 : -1);
}

答案 1 :(得分:10)

如果我正确理解了这个问题,你需要伪随机序列1和-1:

int f(void)
{
        return random() & 1 ? 1 : -1;
    //  or...
    //  return 2 * (random() & 1) - 1;
    //  or...
    //  return ((random() & 1) << 1) - 1;
    //  or...
    //  return (random() & 2) - 1; // This one from Chris Lutz
}

更新:好吧,自从我写这篇文章以来,一直困扰着我。常见RNG的一个常见弱点是低阶位可以经历短周期。最好测试一个高阶位:random() & 0x80000 ? 1 : -1

答案 2 :(得分:0)

要直接生成1或-1,您可以执行以下操作:

int PlusOrMinusOne() {
    return (rand() % 2) * 2 - 1
}

但你为什么担心范围更广?

答案 3 :(得分:0)

return ( ((arc4random() & 2) * 2) - 1 );

答案 4 :(得分:-1)

这个额外的步骤不会给你任何额外的“随机性”。只需在您需要的范围内立即生成您的号码(例如-10..10)。 标准rand()将返回此范围内的值:0..1 您可以将其乘以常量以增加范围的范围,或者您可以添加常量以在X轴上向左/向右推动它。 例如。要从(-5..10)范围生成随机值,您将拥有: 兰特()* 15-5

答案 5 :(得分:-1)

rand将为您提供一个从0到RAND_MAX的数字,它将覆盖int中除符号外的所有位。通过将该结果移位1位,您将已签名的MSB转换为符号,但将0 th 位置零,您可以使用来自另一个rand的调用的随机位重新填充该位。 。代码看起来像:

int my_rand()
{
    return (rand() << 1) + (rand() & 1);
}