2015-10-22 3 views
0

Так что я пытаюсь создать случайный массив из 5 элементов, эти элементы должны быть заполнены цифрами от 1 до 6, и они не должны повторяться, я не могу сказать, где моя логика неправильно.Случайный массив без повторных чисел

void genNumber(int vet[]){ 
    int max, i, j, atual; 
    srand(time(NULL)); 

    max = 7; 
    for (i=0;i<5;i++){ 
     vet[i] = rand() % max; 
     while(vet[i] == 0){ 
     vet[i] = rand() % max; 
     } 

     for(j=0;j<i;j++){ 
     atual = vet[j]; 
     while((vet[i] == atual)||(vet[i] == 0)){ 
      vet[i] = rand() % max; 
      atual = vet[j]; 
     } 
     } 
    } 
} 

Обновление: Исправлена ​​

void genNumber(int vet[]){ 
int max, i, j; 
srand(time(NULL)); 

max = 7; 
for (i=0;i<5;i++){ 
    vet[i] = rand() % (max-1) + 1; 

    for(j=0;j<i;j++){ 
     while(vet[j] == vet[i]){ 
      vet[i] = rand() % (max-1) + 1; 
      j = 0; 
     } 
    } 
} 
} 
+0

Какое сообщение об ошибке? – Downvoter

+0

@cad: Если они не уверены, где их логика * неверна, вероятно, она компилируется без ошибок, но не работает должным образом. – Joey

+0

Второй 'atual = vet [j];' кажется избыточным/ошибочным. – JimmyB

ответ

1

Логическая ошибка в том, как вы произвести новое случайное число, когда дубликат найден.

Представьте, что у вас уже есть vel = {1,2,0,0,0,...} и пытаются найти номер для vel[2]. Если вы случайно нарисуете 2, вы обнаружите, что он уже там и снова нарисован. Но если вы нарисуете 1 на этот раз, вы не заметите, потому что вы сравниваете только последнее значение, 2 в примере. Таким образом, вы получите vel = {1,2,1,...}.

«Решение»: Каждый раз, когда вы сделать новое случайное число, вы должны сравнить его с всех номеров уже есть в списке.

Другой способ решения этого вопроса - это тот, который я попытался описать в комментариях: вы должны хранить информацию о том, какие числа все еще действительны для ничьей. Вы можете использовать массив «output» для этого, как вы сейчас делаете, или вы можете использовать другое хранилище, из которого вы «удалили» запись после ее рисования.

+0

Да, это правильный способ реализовать свой выбор алгоритма, но это ужасный алгоритм использования: он будет тратить огромное количество времени, отклоняя плохие числа. Правильная вещь (как указывает Линус ниже) состоит в том, чтобы заполнить массив с 1..6, перетасовать его, а затем использовать первые пять элементов. –

0

При генерации случайного числа вы должны проверить, найден ли он в массиве, поэтому итерации по массиву и проверки. Если число найдено, сгенерируйте еще одно случайное число и проверьте, пока новый номер не будет найден в массиве. После этого назначьте его и повторите.

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

int check(int vet[],size_t size,int val); 

void genNumber(int vet[],size_t size); 

int main(void) 
{ 
    srand(time(NULL)); 

    int vet[5]; 

    size_t size = 5; 

    genNumber(vet,size); 

    for(size_t n = 0 ; n < size ; n++) 
    { 
     printf("%d ",vet[n]); 
    } 
} 

void genNumber(int vet[],size_t size) 
{ 
    int num = rand() % 6 + 1; 

    vet[0] = num; 

    for(size_t n = 1 ; n < size ; n++) 
    { 
     num = rand() % 6 + 1; 
     while(1) 
     { 
      if(check(vet,n,num)) 
      { 
       num = rand() % 6 + 1; 
      } 
      else 
      { 
       vet[n] = num; 
       break; 
      } 
     } 
    } 
} 

int check(int vet[],size_t size,int val) 
{ 
    for(size_t n = 0 ; n < size ; n++) 
    { 
     if(vet[n] == val) 
     { 
      return 1;//FOUND 
     } 
    } 
    return 0;//NOT FOUND 
} 
0

В качестве альтернативы вы можете заполнить массив со значением от 1 до 6. Затем вы можете перемешать массив в случайных indicies.

#define MAX 6 

void swap (int *a, int *b) { 
    int temp = *a; 
    *a = *b; 
    *b = temp; 
} 

void genNumber(int *vet) { 
    int i; 

    for(i=0;i<MAX;i++) { 
    vet[i] = i+1; 
    } 

    for(i = MAX-1;i > 0;i--) { 
    // Pick a random index from 0 to i 
    int j = rand() % (i+1); 
    // Swap vet[i] with the element at random index 
    swap(&vet[i], &vet[j]); 
    } 
} 

Кроме того, вы не должны вызывать srand(time(NULL)); внутри функции genNumber, если вы собираетесь назвать его более чем один раз, becaues в противном случае это даст вам те же номера, если вы называете это более чем один раз в секунду.

Впоследствии просто используйте первые пять элементов из массива. Таким образом, вы бы назвали это следующим образом:

int vet[MAX] = {0}; 
srand(time(NULL)); 
genNumber(vet); 
for(i=0;i<5;i++) { 
    printf("after num %d\n", vet[i]); 
} 
Смежные вопросы