2017-12-15 15 views
-2

x(パラメータ)乱数を生成し、繰り返しを取り除き、配列に格納された値を返す関数を持っています。rand()はsrand()呼び出しが1つだけあっても値を繰り返す

乱数を呼び出すためにrand()を使用していますが、xパラメータを5に設定して関数を呼び出すと、rand()が同じ4または5の数値を返すため、無限ループになります。

私はsrand()をmain()で一度だけ呼び出しました。

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

    erase = eraser(4); 
} 

int* eraser(int array_size) 
{ 
    array_size++; 
    int* remove_ids = malloc(sizeof(int*) * array_size); 
    int t, v; 
    int i; 

    for(i = 0; i < array_size; i++) { 
     t = 1+(rand() & 80); 
     v = 1+(rand() & 80); 

     printf("t=%d , v=%d\n", t, v); 
     remove_ids[i] = t; 

     if(i == 0){ 
      remove_ids[i] = array_size; 
     } 
     else { 
      for(int c = 1; c < i; c++) { 
       if(remove_ids[c] == t) { 
        i--; 
        break; 
       } 
      } 
     } 
    } 

    return(remove_ids); 
} 

出力:

t=1 , v=1 
t=81 , v=1 
t=81 , v=65 
t=65 , v=17 
t=17 , v=65 
t=17 , v=65 
t=1 , v=65 

私はeraser(5)を呼び出す場合、私は無限ループで立ち往生。興味深いことに、プログラム内の別の関数rand()は完全に機能しています。

+12

「&80」はどう思いますか? – tkausl

+0

* facepalm *ありがとうございました! – CallMeTheMan

+3

ヒント: '80 == 0x50 == binary 01010000' – iBug

答えて

2

&(ビット単位)の代わりに%(mod)が必要だと思います。

+0

ありがとうございます。それはかなりばかな間違いでした。 – CallMeTheMan

関連する問題