我正在尝试随机生成正数或负数,而不是担心我希望随机生成1或-1的更大范围,只是乘以我的其他随机数。
我知道这可以用更长的生成0或1的规则来完成,然后检查返回并使用它来乘以1或-1。
希望有人知道在数字上随机设置符号的简单方法。尽量保持我的代码尽可能干净。
答案 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);
}