为随机和不重复创建数字

Create number for random and non repeat

我是代码:

       Random rand = new Random();
       int[] arr = new int[4];
       for (int i = 0; i < 4; i++)
       {
           for (int k = 0; k < 4; k++)
           {
               int rad = rand.Next(1, 5);
               if (arr[k] != rad)
                   arr[i] = rad;
           }
       }
       for (int i = 0; i < 4; i++)
           MessageBox.Show(arr[i].ToString());

我想要凌晨 1 点到 4 点的生产编号,并且彼此不相等。 tnx.

创建一个包含您想要的号码的列表,然后将它们随机排列:

var rnd = new Random();
List<int> rndList = Enumerable.Range(1, 4).OrderBy(r => rnd.Next()).ToList();

如果你想要一个数组而不是列表:

var rnd = new Random();
int[] rndArray = Enumerable.Range(1, 4).OrderBy(r => rnd.Next()).ToArray();

创建一个包含唯一元素的数组,然后对其进行洗牌,如下面的代码所示,它将按照使用的统一随机顺序对数组进行洗牌 Fisher-Yates shuffle algorithm:

int N = 20;
var theArray = new int[N];
for (int i = 0; i < N; i++)
    theArray[i] = i;

Shuffle(theArray);

public static void Shuffle(int[] a) {
    if (a == null) throw new ArgumentNullException("Array is null");
    int n = a.Length;
    var theRandom = new Random();
    for (int i = 0; i < n; i++) {
        int r = i + theRandom.Next(n-i);     // between i and n-1
        int temp = a[i];
        a[i] = a[r];
        a[r] = temp;
    }
}

可以找到算法的解释和模板版本in this post,Jon Skeet 的回答很好。

public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random rng)
{
    T[] elements = source.ToArray();
    // Note i > 0 to avoid final pointless iteration
    for (int i = elements.Length-1; i > 0; i--)
    {
        // Swap element "i" with a random earlier element it (or itself)
        int swapIndex = rng.Next(i + 1);
        T tmp = elements[i];
        elements[i] = elements[swapIndex];
        elements[swapIndex] = tmp;
    }
    // Lazily yield (avoiding aliasing issues etc)
    foreach (T element in elements)
    {
        yield return element;
    }
}

反过来想:

而不是:

generating a number and then check it if it is not duplicate

你做到了:

you already have a set of non-duplicate numbers, then you take it one-by-one - removing the possibilities of duplicates.

像这样可以做到:

List<int> list = Enumerable.Range(1, 4).ToList();
List<int> rndList = new List<int>();
Random rnd = new Random();
int no = 0;
for (int i = 0; i < 4; ++i) {
    no = rnd.Next(0, list.Count);
    rndList.Add(list[no]);
    list.Remove(list[no]);
}

结果在你的 rndList 中。

这样就不会出现重复了。

int[] arr = new int[5];
int i = 0;
while (i < 5)
{
    Random rand = new Random();
    int a = rand.Next(1,6);

    bool alreadyexist = false;
    for (int j = 0; j < 5; j++)
    {

        if (a == arr[j])
        {
            alreadyexist = true;
        }

    }
    if (alreadyexist == false)
    {
        arr[i] = a;
        i++;
    }

}
for (int k = 0; k < 5; k++)
{

    MessageBox.Show(arr[k].ToString());
}