2015-10-22 92 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,...}

「解決方案」:時候你畫你必須在列表中已經比較反對所有號碼一個新的隨機數。

解決此問題的另一種方法是我在評論中試圖概述的一種方法:您必須保留有關哪些數字對於繪圖仍然有效的信息。您可以像現在這樣使用「輸出」數組,或者您可以使用另一個存儲,一旦它被繪製就從中「刪除」一個條目。

+0

是的,這是實現他的算法選擇的正確方法,但這是一個可怕的算法使用:它會浪費大量的時間拒絕壞數字。正確的做法(如Linus指出的)是用1..6填充數組,然後使用前五個元素。 –

0

當生成一個隨機數時,您必須檢查它是否在數組中找到,因此遍歷數組並檢查。如果找到了數字,則生成另一個隨機數並檢查,直到找不到新數在array.after之後,分配它並重復。

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