0

繰り返しなしで1から10までの乱数で配列を埋めようとしています。私は再帰でそれをやろうとします。私は再帰を使って、そして使わずにそれをやろうとしています(ここでは両方ともありますが、どちらの方法でも運がありません)。2つのコードがありますが、どちらも機能していません。

1:

static int reco(int arr,int[] times)
{
    Random rnd = new Random();
    arr = rnd.Next(1, 11);
    return times[arr] > 0 ? reco(arr, times) : arr;
}

static void Main(string[] args)
{
    int i = 0;
    int[] arr = new int[10];
    int[] times = new int[11];
    Random rnd = new Random();

    for (i = 0; i < 10; i++)
    {
        arr[i] = rnd.Next(1, 11);
        times[arr[i]]++;

        if (times[arr[i]] > 0)
            arr[i] = reco(arr[i], times);
    }

2:

static int reco(int arr,int[] times)
{
    Random rnd = new Random();
    arr = rnd.Next(1, 11);
    if (times[arr] > 0)
        return reco(arr, times);
    else
        return arr;
}
static void Main(string[] args)
{
    int i = 0;
    int[] arr = new int[10];
    int[] times = new int[11];
    Random rnd = new Random();
    for (i = 0; i < 10; i++)
    {
        arr[i] = rnd.Next(1, 11);

        if (times[arr[i]] > 0)
            arr[i] = reco(arr[i], times);

        times[arr[i]]++;
    }
}
4

5 に答える 5

4

1 から 10 までの乱数だけが必要な場合は、Enumerable.Rangeランダムに使用して並べ替えることができます。

var ran = new Random();
int[] randomArray = Enumerable.Range(1, 10).OrderBy(x => ran.Next()).ToArray();
于 2013-02-14T22:23:05.187 に答える
2

次のような特定の範囲内で一意の「乱数」を生成します。

List<int> theList = Enumerable.Range(0, 10).ToList();
theList.Shuffle();

出力例:

[1,5,4,8,2,9,6,3,7,0]

シャッフル関数 (出典: List<T> をランダム化):

public static void Shuffle<T>(this IList<T> list)  
{  
    Random rng = new Random();  
    int n = list.Count;  
    while (n > 1) {  
        n--;  
        int k = rng.Next(n + 1);  
        T value = list[k];  
        list[k] = list[n];  
        list[n] = value;  
    }  
}
于 2013-02-14T22:23:18.403 に答える
1

あなたは C# を使用していて、配列内の乱数を知っているので、配列を作成してから位置をランダム化してみませんか? 次に例を示します。

using System.Linq;

//......

Random rand = new Random();
int[] randomNumbers = new int[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
randomNumbers.OrderBy(num => rand.Next());
于 2013-02-14T22:51:54.617 に答える
0
    static void Main()
    {
        int[] arr = new int[10];
        List<int> numbers = Enumerable.Range(1, 10).ToList();
        Random rnd = new Random();
        for (int i = 0; i < 10; i++)
        {
            int index = rnd.Next(0, numbers.Count - 1);
            arr[i] = numbers[index];
            numbers.RemoveAt(index);
        }
    }
于 2013-02-14T22:20:35.077 に答える
0

あなたはこれを行うことができます。再帰的なバージョンは、質問が宿題のように聞こえるため、元のポスターの演習として残されています。

int[] arr = new int[10];

// Fill the array with values 1 to 10:
for (int i = 0; i < arr.Length; i++)
{
    arr[i] = i + 1;
}

// Switch pairs of values for unbiased uniform random distribution:
Random rnd = new Random();
for (int i = 0; i < arr.Length - 1; i++)
{
    int j = rnd.Next(i, arr.Length);

    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

これは、以下のコメントで Eric Lippert によって提案されたFisher-Yates (Knuth) シャッフルを使用します。

于 2013-02-14T22:26:06.607 に答える