我正在开展一个学校项目,我在屏幕中间有一条道路,两边各有一条越野车。我需要一些障碍才能出现越野。为了让它们出现在两边,我需要生成一个中间有间隙的随机数:即0-10,30-40。
我该如何完成这项任务?
答案 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分钟来完成所有代码(编码,测试)。