1

1000 個の要素を持つ IntArray に値をランダムに割り当てる必要があります。ただし、要素を繰り返すことはできません。私はこのコードを使用しました...

public int[] Numbers()
{
    Random random = new Random();
    int check;

    for (int i = 0; i < numbers.Length; i++)
    {
        check = random.Next(0, 9999);

        while (!numbers.Contains(check))
        {
            numbers[i] = check;
        }
    }

    return numbers;
}

しかし、その後、多くの数値がデフォルト値 (0) になります。私は何を間違っていますか?

4

5 に答える 5

4

ロジックが少しずれています。Contains() が失敗した場合でも、そのインデックスを割り当てる必要があります。

for (int i = 0; i < numbers.Length; i++)
{
    check = random.Next(0, 9999);

    while (numbers.Contains(check))
    {
        // The number existed, so recompute...
        check = random.Next(0, 9999);
    }

    numbers[i] = check;
}
于 2013-01-28T15:44:11.750 に答える
2

エントリが既に存在する場合はスキップしているため、エントリは 0 です。whileループを変更します。

for (int i = 0; i < numbers.Length; i++)
{
    check = random.Next(0, 9999)
    while (numbers.Contains(check))
    {
        check = random.Next(0, 9999)
    }

    numbers[i] = check;
}

numbersN個の異なる乱数を生成するよりパフォーマンスの高い(メモリとループの交換)手段ですが:

int ii = 0;
var numbers = new int[N];
var used = new HashSet<int>(); // much faster on lookups than Array.Contains
while (used.Count < N)
{
    var check = random.Next();
    if (used.Add(check)) numbers[ii++] = check;
    // alternatively: if (used.Add(numbers[ii] = check)) ii++;
}

return numbers;
于 2013-01-28T15:44:18.770 に答える
0

チェックに失敗した場合は、番号をスキップします。チェックが失敗した場合、ループが続行する前に新しい番号を生成するようにループを変更します

于 2013-01-28T15:45:58.307 に答える
0

必ずしも最もパフォーマンスが高いとは限りませんが、次のようにすることもできます。

var rnd = new Random();
var result = Enumerable.Range(0, 10000).OrderBy(i => rnd.Next()).Take(1000).ToArray();
于 2013-01-28T16:12:07.527 に答える
-1

これを調べる別の方法は、1000 アイテムの順序配列をシャッフルすることです。次のようなものを使用できます。

        public T[] Shuffle<T>(T[] array)
        {
                var random = _random;
                for (int i = array.Length; i > 1; i--)
                {
                        // Pick random element to swap.
                        int j = random.Next(i); // 0 <= j <= i-1
                        // Swap.
                        T tmp = array[j];
                        array[j] = array[i - 1];
                        array[i - 1] = tmp;
                }
                return array;
        }

そして、それをそのように使用します

                int[] values = new int[1000]
                for (int i=0; i<999; i++)
                   values[i] = i;

                values = Shuffle<int>(values);
                foreach (int item in values)
                {
                        Response.Write(item);
                }
                Response.Write("</br>");
                values = Shuffle<int>(values);
                foreach (int item in values)
                {
                        Response.Write(item); //this will generate a unique random from 0-999
                }

ここから取られたコード例

于 2013-01-28T15:49:27.547 に答える