生成唯一的随机数,除了C中的特定随机数

我想知道,除了特定的随机数之外,我怎么能生成独特的随机数。 例如,如果我想生成范围1 to 10 except from 3数字, 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,则加1。

生成一个数字。 检查其值,如果数字为3则生成另一个。 如果不是3则使用它。

编辑:咖啡之前的思考是一个糟糕的计划。 如果你想以随机顺序得到该范围内的每个数字,那么我同意其他人谈论改组列表。 但是,如果你想要一些范围的随机子集,我会存储一个禁止值列表。 如果范围不是很大(例如不是0 n个数也是合适的。

每次生成一个数字时,检查生成的数字是否在禁止列表中,如果是,则生成另一个数字。 每次生成有效数字时,都会将其添加到列表中,以确保生成的数字是唯一的。 该列表还应使用您不需要的数字进行初始化(给出的示例中为3)。

你可以尝试这样: –

 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)} 

这是我的答案 – 在[min,max]中返回随机值,除了“except”。

 int myrand(int min, int max, int except) { int rc; do { rc = min + rand() % (max - min); } while(rc == except); return rc; } 

此代码将生成从给定范围的最小值到最大值的唯一随机数。

 #include #include  #include  #include  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; }