2017-11-08 5 views
-2

私は、ループするたびにランダムに正しい配列の9番目の要素を選ぶループを作っていました。配列の特定の部分をランダムにループする方法はありますか?

合計で99個の要素がループ内にあります。

各9番目の要素は同じです(%9)。私は残りの90をアプリケーションを開くたびにランダムにループさせる必要があります。私はリストに私の要素を追加した後、その

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     string[] assignments = new string[] { "https://cdn2.iconfinder.com/data/icons/animals/48/Turtle.png", "https://cdn2.iconfinder.com/data/icons/animals/48/Butterfly.png", "https://cdn2.iconfinder.com/data/icons/animals/48/Dolphin.png", "https://cdn2.iconfinder.com/data/icons/animals/48/Elephant.png", "https://cdn2.iconfinder.com/data/icons/animals/48/Hippopotamus.png", "https://cdn2.iconfinder.com/data/icons/animals/48/Panda.png" }; 
     Random rnd = new Random(); 

     string[] randomingArray = assignments.OrderBy(x => rnd.Next()).ToArray(); 

     string repeatNumber = ""; 

     List<string> animals = new List<string>(); 

     for (int i = 1; i < 100; i++) 
     { 
      if (i == 9) 
      { 
       repeatNumber = randomingArray[i % randomingArray.Length]; 
       animals.Add(repeatNumber); 
      } 
      else if ((i % 9) == 0) 
      { 
       animals.Add(repeatNumber); 
      } 
      else 
      { 
       // random animals.Add(); <-- it should loop randomly here. 
      } 
      ItemsControl1.ItemsSource = animals; 
     } 
    } 
} 

との結合を介して、XAMLにそのリストを送信します。

は私のコードを確認してください。

+1

コードを書く時間がありませんが、この問題の典型的な解決方法は、90個の残りの「ランダム」アイテムを別の配列またはリストにコピーし、[_shuffle_](https://stackoverflow.com/質問/ 273313/randomize-a-listt)を使用してください。 –

+0

*具体的な問題を明確にしたり、詳細を追加して必要なものを正確に強調してください。現在書かれているとおり、あなたが求めていることを正確に伝えるのは難しいです。* –

+0

シャッフリングについては、https://stackoverflow.com/questions/1651619/optimal-linq-query-to-get-a-random-sub-コレクションシャッフル/ 1653204#1653204 –

答えて

1

を行うことができ、各時間9番目の要素を選択する必要がある場合:

private Random rnd = new Random(); 
public MainWindow() 
{ 
    InitializeComponent(); 
    string[] assignments = new string[] 
    { 
     "https://cdn2.iconfinder.com/data/icons/animals/48/Turtle.png", 
     "https://cdn2.iconfinder.com/data/icons/animals/48/Butterfly.png", 
     "https://cdn2.iconfinder.com/data/icons/animals/48/Dolphin.png", 
     "https://cdn2.iconfinder.com/data/icons/animals/48/Elephant.png", 
     "https://cdn2.iconfinder.com/data/icons/animals/48/Hippopotamus.png", 
     "https://cdn2.iconfinder.com/data/icons/animals/48/Panda.png" 
    }.OrderBy(x => rnd.Next()).ToArray(); 

    string[] animals = 
     Enumerable 
      .Range(0, 99) 
      .Select(i => assignments[i % assignments.Length]) 
      .ToArray(); 

    foreach (int i in Enumerable.Range(1, 9)) 
    { 
     animals[i * 9] = assignments[9 % assignments.Length]; 
    } 

    ItemsControl1.ItemsSource = animals; 
} 

をジャストあなたの問題を救うための小さなヒントは、常にあなたのRandom変数を1つのフィールドにしてください - これは迅速な呼び出しコードが乱数を繰り返すことで潜在的な間違いを回避します。それはこのコードでは起こりませんが、入るのは良い習慣です。


は、私はちょうど私がこれを行うことにより、 foreachループを失う可能性があることに気づい:さらに良いのです

string[] animals = 
     Enumerable 
      .Range(0, 99) 
      .Select(i => assignments[i % 9 == 0 ? 9 : i % assignments.Length]) 
      .ToArray(); 

+0

こんにちは!あなたの答えをありがとう。この行は、.Select(i => assignments [i]) "System.IndexOutOfRangeExceptionをコンパイルするときにエラーが発生します: 'インデックスが配列の範囲外です。'"どうすれば修正できますか? –

+0

@RalfsR - 申し訳ありませんが、私は小さな間違いをしました。それを私が直した。 – Enigmativity

0

あなたは

var rand = new Random(); 
int value = rand.Next(0, 99); // 0 is the min and 99 is the max 

ような何かを行うことができますし、配列にランダムな要素を取得するために、あなたはちょうどあなたが数は9あなたが可能性だったかどうかを確認する必要がある場合は

var result = randomingArray[value]; 

だろう

場合行う(値== 9)

{

}

あなただけの私は、これはあなたが望む結果を与えるだろうと思い、あなただけの

var result = randomingArray[9]; 
+0

99は、** exclusive ** maxです。それはそれを述べる価値があるかもしれません。 – Enigmativity

関連する問題