生成唯一的随机数,除了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
每次生成一个数字时,检查生成的数字是否在禁止列表中,如果是,则生成另一个数字。 每次生成有效数字时,都会将其添加到列表中,以确保生成的数字是唯一的。 该列表还应使用您不需要的数字进行初始化(给出的示例中为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; }