生成带间隙的随机数

时间:2018-04-13 13:29:59

标签: c

我正在开展一个学校项目,我在屏幕中间有一条道路,两边各有一条越野车。我需要一些障碍才能出现越野。为了让它们出现在两边,我需要生成一个中间有间隙的随机数:即0-10,30-40。

我该如何完成这项任务?

1 个答案:

答案 0 :(得分:2)

您希望在[0; 10]或[30; 40]中生成数字。

[0; 10]是11号。 [30; 40]是11号。

所以你可以在[0; 21]中生成一个数字(从21开始22个数字到0)

现在,如果你的结果在[0; 10]中,那就很好,但是如果你的结果在[11; 21]中,你必须添加一个偏移量以便在[30; 40]中结束。你怎么能在[30; 40]中“转变”[11; 21]?只需添加19.

在与SteveSummit的评论讨论之后,这里是以前算法的一般实现:

#include <stdlib.h>
#include <stdio.h>

int GetRandomInRanges(int *ranges, size_t size)
{
  size_t nbCandidates = 0;
  size_t randomNumber;

  if (!size || size & 1) {
    printf("Error : size must be an even number strictly superior to 0, not %d.\n", size);
    exit(1);
  }
  for (size_t i = 0; i < size; i += 2) {
    if (ranges[i] > ranges[i + 1]) {
      printf("Error : ranges must be sorted : [%d, %d] is not correct.\n", ranges[i], ranges[i + 1]);
      exit(1);
    }
    nbCandidates +=  ranges[i + 1] - ranges[i] + 1;
  }

  randomNumber = (double)rand() / RAND_MAX * nbCandidates;

  for (size_t i = 0; i < size; i += 2) {
    size_t nbNumberInRange = ranges[i + 1] - ranges[i] + 1;
    if (randomNumber < nbNumberInRange) {
      return (ranges[i] + randomNumber);
    }
    randomNumber -= nbNumberInRange;
  }
  return (0); // Just for the compilator to not throw warning
}

int main(void)
{
  int    ranges[]   = {1, 3, 2, 4};
  size_t rangesSize =  sizeof(ranges)/sizeof(*ranges);

  for (size_t i = 0; i < rangesSize; i += 2)
    printf("[%d, %d] ", ranges[i], ranges[i + 1]);
  printf("\n");

  for (size_t i = 0; i < 10; ++i)
    printf("get %d\n", GetRandomInRanges(ranges, rangesSize));

  return (0);
}

我必须承认,我花了将近25分钟来完成所有代码(编码,测试)。