如何制作从不在数组中重复的随机数?

时间:2013-11-30 19:28:26

标签: c# arrays random

listBox1.Items.Clear();
int[] sayısal = new int[6];
Random rastgele = new Random();
for (int i = 0; i < 6; i++)
{
   do
   {
      sayısal = rastgele.Next(1, 50);
   }
   while (listBox1.Items.IndexOf(sayısal) != -1);
      listBox1.Items.Add(sayısal);
}

当我这样做时,我接到一个错误,叫

  

“无法将类型'int'隐式转换为'int []'”

"sayısal = rastgele.Next(1, 50);"

。我能做些什么呢?

4 个答案:

答案 0 :(得分:3)

您可以生成序列1..50并对其进行随机播放(即按随机值排序):

Random rastgele = new Random();
int[] sayısal = Enumerable.Range(1, 50) // generate sequence
                          .OrderBy(i => rastgele.Next()) // shuffle
                          .Take(6) // if you need only 6 numbers
                          .ToArray(); // convert to array

您的代码无效,因为您正在尝试将生成的项目分配给数组变量。

sayısal = rastgele.Next(1, 50);

应该是:

do {
   sayısal[i] = rastgele.Next(1, 50);
} while(listBox1.Items.IndexOf(sayısal[i]) != -1);

正如我在评论中指出的那样,最好将UI逻辑和数组生成分开。即。

// generate array (optionally move to separate method)
int itemsCount = 6;
int[] items = new int[itemsCount]; // consider to use List<int>
Random random = new Random();
int item;

for(int i = 0; i < itemsCount; i++)
{
   do {
      item = random.Next(1, 50);
   } while(Array.IndexOf(items, item) >= 0);

   items[i] = item;
}

// display generated items
listBox1.Items.Clear();
for(int i = 0; i < items.Length; i++) // or use foreach
    listBox1.Items.Add(items[i]);

答案 1 :(得分:2)

因为Random.Next方法返回int,而不是int[]。并且没有从int[]int的隐式转换。

Return Value
Type: System.Int32
A 32-bit signed integer greater than or equal to minValue and less than maxValue; that is, the range of return values includes minValue but not maxValue. If minValue equals maxValue, minValue is returned.

如果您想填充数组,可以使用 lazyberezovsky mentioned Enumerable.Range

答案 2 :(得分:0)

此方法采用整数数组并随机排序。 因此,使用循环填充数组,然后使用它来随机排序数组。 你应该归功于其他人,因为他们是第一个发布有效答案的人。我只是想到另一种方法可以做到这一点。

amount是您希望数组随机化的次数。数字越大,数字随机的几率就越大。

    private Random random = new Random();

    private int[] randomizeArray(int[] i, int amount)
    {
        int L = i.Length - 1;
        int c = 0;
        int r = random.Next(amount);
        int prev = 0;
        int current = 0;
        int temp;

        while (c < r)
        {
            current = random.Next(0, L);
            if (current != prev)
            {
                temp = i[prev];
                i[prev] = i[current];
                i[current] = temp;
                c++;
            }
        }
        return i;
    }

答案 3 :(得分:0)

在选择数据结构和算法时要小心,选错了,然后用O(n ^ 2)结束。一个合理的解决方案IMHO是一个打字的哈希表(即字典),它会给你O(n):

Random rnd = new Random();              
        var numbers = Enumerable
            .Range(1, 1000000)
            .Aggregate(new Dictionary<int, int>(), (a, b) => {
                int val;
                do {val = rnd.Next();} while (a.ContainsKey(val));
                a.Add(val, val);
                return a;
            })
            .Values
            .ToArray();

虽然性能取决于阵列尺寸明显小于可用数字的集合,并且没有办法检测何时不满足这种情况(或更糟糕的是它何时会出现这种情况),但仍然不理想; s更大,在这种情况下算法将进入无限循环)。