2017-08-27 10 views
-1

現在、重複のない1から45までの乱数を生成するプログラムを作成しようとしています。私のプログラムは、else文を使わずに実行すると、重複が出てくるたびに、関数elseが使用されたときに番号0を入力します。私は1と45の間の乱数を表示したいが、可変サイズは配列のサイズを指示しなければならない。 c#重複のない配列の乱数ジェネレータ

public static int[] InitializeArrayWithNoDuplicates(int size) 
    { 
    int number; 
    int[] noDuplicates = new int[size]; 

     for (int i = 0; i < size; i++) 
     { 
      number = rng.Next(1, size); 
      if (!noDuplicates.Contains(number)) 
       noDuplicates[i] = number; 
      // else 
      //  i--; 
     } 
     return noDuplicates; 

が、私はそれを修正するかどうかはわからないよ:たとえば35

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace RandomArray 
{ 
public class RandomArrayNoDuplicates 
{ 
    static void Main(string[] args) 
    { 
     int size = 45; 
     int[] noDuplicateArray = new int[size]; 
     noDuplicateArray = InitializeArrayWithNoDuplicates(size); 
     DisplayArray(noDuplicateArray); 
     ExitProgram(); 

    } //end Main 
    static Random rng = new Random(); 

    /// <summary> 
    /// Creates an array with each element a unique integer 
    /// between 1 and 45 inclusively. 
    /// </summary> 
    /// <param name="size"> length of the returned array < 45 
    /// </param> 
    /// <returns>an array of length "size" and each element is 
    /// a unique integer between 1 and 45 inclusive </returns> 
    /// 
    static void ExitProgram() 
    { 
     Console.Write("\n\nPress any key to exit program: "); 
     Console.ReadKey(); 
    }//end ExitProgram 

    public static int[] InitializeArrayWithNoDuplicates(int size) 
    { 
    int number; 
    int[] noDuplicates = new int[size]; 

     for (int i = 0; i < size; i++) 
     { 
      number = rng.Next(1, size); 
      if (!noDuplicates.Contains(number)) 
       noDuplicates[i] = number; 
      // else 
      //  i--; 
     } 
     return noDuplicates; 

    } 
    static void DisplayArray(int[] noDuplicates) 
    { 
    foreach (int element in noDuplicates) 
     { 
      Console.Write("\t" + element + "\n"); 
     } 
    } 
} 
} 

のアレイサイズで1と45の間のランダムな整数問題は、このコードのビットです。私は、列挙可能なアプローチを使用するのではなく、random.next関数を使用することをお勧めします。おかげ

+0

// Exceptions: // T:System.ArgumentOutOfRangeException: // minValue is greater than maxValue. 

rng.Next(1, 0); 

昇給の例外ArgumentOutOfRangeException例外が表示されますか? – Blacktempel

答えて

1

試行次

 public static int[] InitializeArrayWithNoDuplicates(int size) 
     { 
      Random rand = new Random(); 
      return Enumerable.Repeat<int>(0, size).Select((x, i) => new { i = i, rand = rand.Next() }).OrderBy(x => x.rand).Select(x => x.i).ToArray(); 
     } 

コードが値ゼロで満たさサイズに等しい整数(Enumerable.Repeat(0、サイズ))の配列を作成だけに等しい配列を取得しますサイズ。したがって、selectは2次元配列を作成します。ここで、iは0からsizeまでの数であり、randは乱数です。私は繰り返さない。次に、コードは2次元配列を乱数で単純に並べ替え、i値のみを抽出します。

+0

良い答え。あなたは 'Enumerableを返すものを分解できますか?(0、size).Select((x、i)=> new {i = i、rand = rand.Next()})OrderBy(x => x.rand ).Select(x => xi).ToArray(); 'していますか? –

+1

答えに説明を追加してください。 – jdweng

+0

これは、1から45までの任意の数値が必要な場合に機能します。しかし、1から45の間のランダムな整数を常に変化させ、配列のサイズを変えたいとします。 –

0

あなたは次のメソッドの定義に行けば、あなたは正確に問題がある何

関連する問題