2016-01-02 6 views
0

Я пытаюсь рандомизации 4 различных чисел в C и пытается следующий код:Randomize 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

вы забыли назвать 'srand (время (NULL));' перед первой вызов rand(); –

+2

Вам нужно заменить '&&' на '||'. –

+0

Условие 'while' не отражает ваших намерений. Вы уверены, что это правильно? –

ответ

2

Попробуйте как этот

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() при запуске программы, или вы получите ту же последовательность всегда.

+0

Почему не 'int j = rand()% 7;' etc, с инициализацией в той же строке, что и объявление. Между прочим, он отрубает три линии от источника. –

2

Этот код будет выбирать 4 разных номера в диапазоне 0 .. 6, он работает, создавая массив доступных чисел, так как каждый из них выбран из списка.

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

#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<RANGE; size++) { 
     pool[size] = size;   // create number pool 0..6 
    } 
    srand((unsigned)time(NULL)); 

    // pick different numbers 
    for(i=0; i<PICK; i++) { 
     n = rand() % size;   // random array index 
     printf("%d ", pool[n]);  // select number from pool 
     pool[n] = pool[--size];  // remove from pool 
    } 
    printf("\n"); 
    return 0; 
} 
1

Чтобы получить случайную, unbiased последовательность:

#include <stdio.h> 
#include <stdlib.h> 

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

Пожалуйста, следуйте ссылки ссылки в коде.

1

Я хотел бы предложить универсальное решение:

  • массив любого размера

  • нижней и верхней границ, посланных в качестве параметров.

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <time.h> 
    
    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<amount;) 
        { 
         temp = rand() % (upper_bound - lower_bound + 1) + lower_bound; 
         for(j=i-1; j>=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.