私は C# が初めてで、配列を使用してアプリケーションを作成しています。以下に示す数字の配列があります。
int[] array2 = new int[] { 1, 3, 5, 7, 9 };
私がする必要があるのは、配列内のこれらの数字の順序を繰り返しなしで変更することです。これは、ランダム関数を使用すると、数字の繰り返しが表示されるためです。
この方法を見ましたが、数字で適用する方法がわかりません: http://www.dotnetperls.com/shuffle
私は C# が初めてで、配列を使用してアプリケーションを作成しています。以下に示す数字の配列があります。
int[] array2 = new int[] { 1, 3, 5, 7, 9 };
私がする必要があるのは、配列内のこれらの数字の順序を繰り返しなしで変更することです。これは、ランダム関数を使用すると、数字の繰り返しが表示されるためです。
この方法を見ましたが、数字で適用する方法がわかりません: http://www.dotnetperls.com/shuffle
次の LINQ チェーンを使用できます。
int[] array2 = new int[] { 1, 3, 5, 7, 9 };
var random = new Random();
var total = (int)array2.
OrderBy(digit => random.Next()).
Select((digit, index) => digit*Math.Pow(10, index)).
Sum();
まず、要素をランダムに並べ替え、次に各要素を 10 のインデックス乗で乗算して選択し、それらを合計して結果を整数にキャストします。Random
また、インスタンスに役立つシードを提供していないことに注意してください。疑似ランダムな結果を生成するために、それを行うことができます。
整数へのキャストを避けるために、こちらで説明されているべき乗法を使用することもできます。
編集:Rhumborlが指摘したように、シャッフルされた配列が必要な場合があります。その場合:
var shuffledArray = array2.OrderBy(n => random.Next()).
ToArray();
あなたのために働くはずです。
C# で作業する場合は、C# 構造体を使用することをお勧めします。
この汎用関数を使用できます
using System;
using System.Collections.Generic;
public static class ListExtensions
{
public static void Shuffle<T>(this IList<T> list)
{
var randomNumber = new Random(DateTime.Now.Millisecond);
var n = list.Count;
while (n > 1)
{
n--;
var k = randomNumber.Next(n + 1);
var value = list[k];
list[k] = list[n];
list[n] = value;
}
}
}
コードは次のようになります。
List<int> list2 = new List<int>(){1, 3, 5, 7, 9};
Shuffle(list2);
繰り返しなしで順序を変更するとはどういう意味かよくわかりません。決して繰り返されない乱数を生成したいだけなら、このようなことができます
private Random rand = new Random();
private List<int> used = new List<int>;
protected int randomNonrepeating() {
int i = rand.next();
while(used.contains(i))
i = rand.next();
used.add(i);
return i;
}
私の推測では、それはあなたが探しているものではありません。提供されたリンクでアルゴリズムを変更して、文字列ではなく整数の配列を処理する場合。タイプを変更するだけです。このようなもの
using System;
System.Collections.Generic の使用; System.Linq を使用します。
static class RandomStringArrayTool { static Random _random = new Random(); }
public static string[] RandomizeStrings(int[] arr)
{
List<KeyValuePair<int, int>> list = new List<KeyValuePair<int, int>>();
// Add all strings from array
// Add new random int each time
foreach (var s in arr)
{
list.Add(new KeyValuePair<int, int>(_random.Next(), s));
}
// Sort the list by the random number
var sorted = from item in list
orderby item.Key
select item;
// Allocate new string array
int[] result = new string[arr.Length];
// Copy values to array
int index = 0;
foreach (KeyValuePair<int, int> pair in sorted)
{
result[index] = pair.Value;
index++;
}
// Return copied array
return result;
}
}
お役に立てれば。
あなたが言ったように、あなたはすでに作業する数値を持つ配列を持っています。そのため、一意の数値で満たされた配列を作成する方法を紹介するつもりはありません。
これが配列をシャッフルする方法です。
ループ内で次の操作を行います。
を。ステップ 1 の方法を使用して、0 から idx1 (両端を含む) の間の乱数を生成します (乱数を idx2 とします)
。idx1 と idx2 で配列の要素を交換します。
簡単な交換は、次のようにして行うことができます。
int tmp = 配列[idx1];
配列[idx1] = 配列[idx2];
配列[idx2] = tmp;
ループが終了し、シャッフルされた配列が残ります。