2

私は C# が初めてで、配列を使用してアプリケーションを作成しています。以下に示す数字の配列があります。

int[] array2 = new int[] { 1, 3, 5, 7, 9 };

私がする必要があるのは、配列内のこれらの数字の順序を繰り返しなしで変更することです。これは、ランダム関数を使用すると、数字の繰り返しが表示されるためです。

この方法を見ましたが、数字で適用する方法がわかりません: http://www.dotnetperls.com/shuffle

4

4 に答える 4

5

次の 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();

あなたのために働くはずです。

于 2013-01-13T15:13:37.130 に答える
1

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);
于 2013-01-13T15:22:55.333 に答える
0

繰り返しなしで順序を変更するとはどういう意味かよくわかりません。決して繰り返されない乱数を生成したいだけなら、このようなことができます

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;
}

}

お役に立てれば。

于 2013-01-13T15:36:34.037 に答える
0

あなたが言ったように、あなたはすでに作業する数値を持つ配列を持っています。そのため、一意の数値で満たされた配列を作成する方法を紹介するつもりはありません。

これが配列をシャッフルする方法です。

  1. 0 から配列の長さまでの乱数を生成する方法を見つけてください。
  2. length_of_the_array-1 から 0 までのループを記述します (このインデックスを idx1 として使用します)。

ループ内で次の操作を行います。

を。ステップ 1 の方法を使用して、0 から idx1 (両端を含む) の間の乱数を生成します (乱数を idx2 とします)
。idx1 と idx2 で配列の要素を交換します。

簡単な交換は、次のようにして行うことができます。

int tmp = 配列[idx1];
配列[idx1] = 配列[idx2];
配列[idx2] = tmp;

ループが終了し、シャッフルされた配列が残ります。

于 2013-01-13T15:20:59.603 に答える