簡體   English   中英

生成不同數字的隨機數

[英]Generate random numbers with different digits

如何生成具有不同數字的所有數字(PS必須以數組的第一個數字開頭和結尾。例如,我有數字0 1 2 3 4並且需要創建數字,例如012340、012430、013240、0124230 ..如果我有5個數字,則意味着有24種不同的組合(!(5-1))。

這是我的代碼(有點混亂,但是也許有人可以幫助我)。 也許可以通過遞歸來解決這個問題?

    public void GenerateDigits(int n)
    {
        n--;
        int[] numbers = new int[n];

        for (int i = 0; i < n; i++)
        {
            numbers[i] = i;
        }

        string[] allDigits = new string[n*n];
        Random rnd = new Random();
        int counter = 0;
        while (allDigits.Length != counter)
        {
            allDigits[counter] = Convert.ToString(numbers[0]) + Convert.ToString(numbers[0]);

            while (allDigits[counter].Length != n + 1)
            {
                char skc = Convert.ToChar(rnd.Next(numbers[1], numbers[n]));
                if (!allDigits[counter].Contains(skc))
                {
                    allDigits[counter] = allDigits[counter].Insert(1,1);
                }
            }
        }
    }

如正確觀察到的那樣,確定為(n-1)! 數組的不同排列,並且需要一種以隨機順序列出它們的算法。 如果您需要以隨機順序生成整個列表,建議您先生成排列列表,然后重新排列。 如果您只想一次生成一個,而又不介意重復,那么我建議您采用任何固定的排列方式,將有資格更改的數字混排,然后輸出結果。 這些在概念上都很簡單; 使用Fisher-Yates進行混洗。

假設您要執行的操作是生成一系列排列的序列,這些序列完全不同,而無需先計算所有排列的列表。 這樣的列表對於合理的n會很長。 如果序列的長度相對於排列數(n-1)!很小,那么記住已經生成的排列,並一遍又一遍地嘗試直到列表中沒有一個,這是一種非常可行的方法。 您需要計算出涉及的概率,以使您對“小”對您的含義有個好主意(隨着列表中添加的每個新排列,預期的運行時間會變差)。 如果已知排列的數量是所有可能排列的數量的相當大的一部分,那么最好事先進行計算,最好采用壓縮格式以節省空間。

正如您所說的“不同數字”,我認為這是一種“唯一結果”約束(即,012340僅一次)。 這就是我所說的“彩票問題”。

如果是這樣,解決方案是創建一個具有所有可能排列的集合,然后使用類似於以下代碼的隨機選擇其中一些:

//Create an array. Fill it with Sequential Numbers.
int[] input = new int[20];

for(int i = 0; i < numbers.lenght; i++)
  input[i] = i;

/*Initialise the instances you will need*/
//Use the array to create a list
List<int> DrawableNumbers = new List<int>(input);
List<int> DrawnNumbers = new List<int>();

//Generate a Random Number Generator
Random rng = new Random();

/*Draw 6 from the group*/
while(DrawnNumbers.Count < 6){
  //Get a random Index to move from DrawableNumbers to DrawnNumbers
  int temp = Random.NextInt(DrawableNumbers.Count);
  DrawnNumbers.Add(DrawableNumbers[i]);
  DrawableNumbers.Remove(temp);
}

由於置換的數量是非線性的,並且可能需要很長的整數(甚至將值存儲為字符串),因此,作為高級版本,您可以僅對可能的組合進行編號。 即1234是1,1243是2,依此類推。然后生成實際結果,以便盡可能晚地輸出。

將括號中的數字(索引0的數字)作為單獨的東西(可能是自定義類中的自己的字段)處理可能會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM