我想知道,除了特定的随机数之外,我怎样才能生成唯一的随机数。例如,如果我想在 range 中生成数字1 to 10 except from 3
,输出应该是这样的:
7 6 1 2 4 9 5 8 10
将数字 1 - 10 洗牌并删除 3。
在改组之前或之后删除 3 都没关系。
或者,将数字 1 - 9 打乱,并将 3 重新标记为 10...
对于没有偏见的洗牌,您可以使用例如 Fisher-Yates 算法。http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
生成 1..9 范围内的随机数,如果数字大于或等于 3,则加一。
生成一个数字。检查其值,如果数字为 3,则生成另一个。如果不是 3,则使用它。
编辑:在喝咖啡之前思考是一个糟糕的计划。如果您想以随机顺序获取范围内的每个数字,那么我同意其他人谈论洗牌列表。但是,如果您想要该范围的一些随机子集,我将存储一个禁止值列表。如果范围不是很大(例如,不是 0<x<INT_MAX 之类的东西),则改组并只取前n 个数字也是合适的。
每次生成一个号码时,检查生成的号码是否在禁止列表中,如果是,则生成另一个号码。每次生成有效号码时,您都会将其添加到列表中,以确保生成的号码是唯一的。该列表还应使用您不需要的数字进行初始化(在给出的示例中为 3)。
这是我的答案 - 返回 [min, max) 中的随机值,“除外”除外。
int myrand(int min, int max, int except) {
int rc;
do {
rc = min + rand() % (max - min);
} while(rc == except);
return rc;
}
此代码将生成给定范围的从最小值到最大值的唯一随机数。
#include<stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int max_range, min_range, i = 0, rand_num;
srand((unsigned)time(NULL));
printf("Enter your maximum of range: ");
scanf("%d", &max_range);
printf("Enter your minimum of range: ");
scanf("%d", &min_range);
bool digit_seen[max_range + 1]; // VLAs For C99 only
for (int i = min_range; i <= max_range; i++)
digit_seen[i] = false;
for (;;)
{
rand_num = rand() % max_range + min_range;
if(rand_num !=3)
if(!digit_seen[rand_num])
{
printf("%d ", rand_num);
digit_seen[rand_num] = true;
i++;
}
if( i == (max_range - 1) )
exit(0);
}
return 0;
}
你可以这样尝试:-
unsigned int
randomnumber(unsigned int min, unsigned int max)
{
double scaled = (double)rand()/RAND_MAX;
return (max - min +1)*scaled + min;
}
然后你可以这样做: -
x = randomnumber(1,10);
if (x==3)
{ x = x+1;}
或者
if (x!=3)
{ printf("%d",x)}