2016-05-04 8 views
-1

私は、繰り返しのない10個の乱数を画面に表示するコードを実行します。私は、コードを最適化できるかどうか、またはこの要求を行うためのより簡単で簡単な方法があるかどうかを知りたいと思います。 ありがとうございます!Cで繰り返しのない乱数のコードを最適化

int main(){ 
int nbr = 0; srand(time(NULL)); 
int arr[10], i, j, flag; 

for (i = 0; i < 10; i++) 
{ 
    do 
    { 
     nbr = rand() % 10 + 1; 
     flag = 1; 
     for (j = 0; j < i; j ++) 
     { 
      if (nbr == arr[j]) 
      { 
       flag = 0; 
       break; 
      } 
     } 

    } while (!flag); 
    arr[i] = nbr; 
} 

for (i = 0; i < 10; i++) 
{ 
    printf("%5d", arr[i]); 
} 



system("PAUSE"); 
return 0; 
} 
+3

で確認してください[codereview.se] –

+0

http://stackoverflow.com/q/36952047/971127 – BLUEPIXY

答えて

1

私はあなたがここでやろうとしているものを手に入れるのであれば、それは次のとおりです。

rand() % 10 + 1を与えられた)ランダムな順序で、1から10までの数字の配列を生成

の代わりに、 1と

  • 塗りつぶしarr ...
  • 10は、をシャッフル:試行錯誤私は次のアルゴリズムをお勧めしたいです

このは私がArtizの仕事が提供するソリューションに同意するが、これはをシャッフルを停止するときの答えるのは難しい質問になります

0

多くが高速に実行されます。 (ランダムではない、注文した)1..10が配列tempた値を作成します

:この問題を解決するには

あなたは(より多くのメモリを使用しますが、あまりクロック時間)以下のソリューションを使用することができます

間のランダムなインデックスrand_iを生成

(10)配列の長さlengthを追跡最終的なアレイ

0とlength - 1

次の位置へコピーtemp[rand_i] 上書きtemp[rand_i]temp[length-1]

によってデクリメントlength

反復ステップ3 - あなたの配列が満たされるまで6 (10回)

これはあなたの過度のループを排除するの両方、およびあなたの配列をシャッフル停止するときの問題

EDIT:含むコード

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

int main(){ 
int nbr = 0; srand(time(NULL)); 
int arr[10], i, j, flag; 
int temp[10] = {1,2,3,4,5,6,7,8,9,10}; 
int length = 10; 


for (i = 0; i < 10; i++) 
{ 

     nbr = rand() % length; // Generate random index between 0 and length - 1 

     arr[i] = temp[nbr];  // Copy value from random index in temp to next index in arr 

     // Now since temp[nbr] is already taken (copied to arr) we should replace it by last available value in temp (temp[lenght]) 
     // and in the next iteration we will create a value between 0 and length -1. This will keep values not yet taken from temp in 
     // contiguous order 

     temp[nbr] = temp[length-1]; 
     length--; 
} 

for (i = 0; i < 10; i++) 
{ 
    printf("%5d", arr[i]); 
} 



return 0; 
} 
+0

プロセスを理解するためにコードを作成することはできますか? –

+0

私は今それについて作業します。私は今日前に時間がなかった。編集して回答に追加する –

関連する問題