随机化4个不同的数字

我试图在C中随机化4个不同的数字并尝试下一个代码:

{ int num1 = 0, num2 = 0, num3 = 0, num4 = 0; int i = 0; while (num1 == num2 && num1 == num3 && num1 == num4 && num2 == num3 && num2 == num4 && num3 == num4 && num3 == num2) { num1 = rand() % 7; num2 = rand() % 7; num3 = rand() % 7; num4 = rand() % 7; } printf("%d %d %d %d\n", num1, num2, num3, num4); } 

代码假设检查数字是否相等,如果它们相等,则需要生成新数字,直到它们全部不同为止。 但由于某种原因,它不能很好地工作,即使是正确的数字,它也会将它们视为错误,它会成为无限循环。

我错过了什么?

此代码将在0 … 6范围内选择4个不同的数字,它通过创建可用数字的数组来工作,因为每个数字都被选中,它将从列表中删除。

 #include  #include  #include  #define RANGE 7 // how many different numbers #define PICK 4 // how many to pick int main(void) { int pool[RANGE]; int size, n, i; for (size=0; size 

试试这样吧

 void get_random_values(int *values) { int source[] = {0, 1, 2, 3, 4, 5, 6}; for (int i = 0 ; i < 7 ; ++i) { int saved; int j = rand() % 7; int k = rand() % 7; saved = source[j]; source[j] = source[k]; source[k] = saved; } values[0] = source[0]; values[1] = source[1]; values[2] = source[2]; values[3] = source[3]; } int main(void) { int values[4]; srand(time(NULL)); get_random_values(values); for (int i = 0 ; i < 4 ; ++i) fprintf(stderr, "%d ", values[i]); fprintf(stderr, "\n"); return 0; } 

不要忘记在程序启动时设置随机种子srand() ,否则您将始终获得相同的序列。

获得随机, 无偏见的序列:

 #include  #include  #define N 7 int main(int argc, char **argv) { // seed random number generator with first argument for easier testing if (argc > 1) { srand(atoi(argv[1])); } int array[N] = {0,1,2,3,4,5,6}; // Fisher–Yates shuffle: // https://en.wikipedia.org/w/index.php?oldid=697311634#The_modern_algorithm for (unsigned i = 0; i < N - 1; ++i) { unsigned modulo = N - i; // unbiased rand() % modulo: // https://stackoverflow.com/a/10989061/416224 unsigned j; do { j = rand(); } while (j >= RAND_MAX - (RAND_MAX % modulo)); j %= modulo; if (j > 0) { int tmp = array[i]; array[i] = array[i + j]; array[i + j] = tmp; } } for (unsigned i = 0; i < N; ++i) { printf("%u. %d\n", i + 1, array[i]); } return 0; } 

请按照代码中引用的链接进行操作。

我建议通用解决方案:

  • 任何大小的数组

  • 作为参数发送的下限和上限。

     #include  #include  #include  void random(int* values, int amount, int lower_bound, int upper_bound) { int i=0, j=0, temp; if(amount > upper_bound - lower_bound + 1) return; // if there are more numbers than given bound for(i=0; i=0; --j) if(temp==values[j]) break; if(temp==values[j]) continue; values[i]=temp; ++i; } } int main() { srand(time(NULL)); int arr[4]={0,0,0,0}; random(arr, 4, 5, 10); for(int i=0; i<4; ++i) printf("%d\n", arr[i]); } 

有了它,您可以拥有(例如)10个原始值,从-6到7。