【问题标题】:Adding -1,0, or 1 randomly to a number in C [closed]将-1,0或1随机添加到C中的数字[关闭]
【发布时间】:2013-02-17 21:05:01
【问题描述】:

我正在尝试找出一种可以使用 srand 和 rand 随机生成 -1,0 或 1 的方法。但是,每当我这样做时,我只能获得生成范围内的值,而不能获得 -1 或 1。

这是我尝试过的:

   int value;
   srand(time(NULL));
   value=2*rand()/(RAND_MAX)-1;

但是,在执行时,我总是生成 0。我希望能够偶尔生成 -1 和 1。问题是我必须使用 rand 和 srand,作为规范的一部分。任何帮助将不胜感激,并提前感谢:)。

【问题讨论】:

  • 记得在您的程序中调用srand(time(NULL)); 不超过一次。尤其不要将其放在循环中或多次调用的函数中。

标签: c random numbers range generator


【解决方案1】:

怎么样

value = (rand() % 3) - 1;

表达式rand() % 3 生成一个介于02(含)之间的随机数,然后减去一个得到-11(含)之间的随机数。

【讨论】:

  • 感谢您帮助这个菜鸟 :)!我真的很感激。
  • RAND_MAX % 3 不是 2 时,这种方法会产生非常轻微的偏差。当这是一个问题时,解决方法通常是在它们发生 @987654328 的最后一个或两个有问题的值时丢弃@可以带。
  • 2^n-1 mod 3 永远不会是 2,因此对于 RAND_MAX 的许多常见值会有偏差。
【解决方案2】:

您的代码有一个差一错误,并可能遭受整数溢出。

改变

value = 2 * rand() / RAND_MAX - 1;

value = rand() / (RAND_MAX / 3 + 1) - 1;

【讨论】:

  • 感谢您的回复!我尝试了第二个表达式,但它每次都生成 1。
  • @pmg:很好,我已经删除了那句话。
【解决方案3】:

首先,您需要 3 个不同的值,但您只要求 2 个。其次,在某些实现(显然是您正在使用的那个)中,RAND_MAX == INT_MAX 因此您的计算可能会溢出。您可以使用浮点数来解决这个问题

// srand(time(NULL)); Only do this once per invocation of your program
int value = (int)(3.0*rand()/RAND_MAX) - 1;

或长长

int value = 3LL*rand()/RAND_MAX - 1;

或将因子移到除数中:

int value = rand()/(RAND_MAX/3) - 1;

编辑:请注意,由于 RAND_MAX 不是 3 的倍数,因此这些会产生略微偏斜(或多或少,因为 RAND_MAX 或多或少)的结果。您可以通过以下方式避免这种情况:

int r;
do
{
    r = rand();
} while (r >= RAND_MAX/3 * 3);
int value = r / (RAND_MAX/3) - 1;

【讨论】:

  • 感谢您的回复!出于某种原因,您的所有三个建议每次都会导致 -1。我不确定为什么会这样,因为你的推理对我来说很有意义。
  • @user2129657 他们在这里工作...... rand() 返回什么值,什么是 RAND_MAX?可能您的实现没有正确定义 RAND_MAX。
  • @JimBalter,+1 尝试平均分配结果并展示如何。
猜你喜欢
  • 2013-04-21
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多