Генерация случайных чисел с разными цифрами - PullRequest
0 голосов
/ 18 февраля 2019

Как мне сгенерировать все числа с разными цифрами (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);
                }
            }
        }
    }

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Как вы сказали "разные цифры", я полагаю, что это ограничение типа "уникальные результаты" (т.е. 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), как отдельная вещь - возможно,собственное поле в пользовательском классе - может помочь с этим.

0 голосов
/ 18 февраля 2019

ОК, как вы правильно заметили, есть (n-1)!различные перестановки вашего массива, и вы хотите алгоритм, который перечисляет их в случайном порядке.Если вам нужно создать весь список в случайном порядке, я бы предложил сначала создать список перестановок, а затем перетасовать его.Если вы просто хотите сгенерировать их по одному и не обращать внимания на дубликаты, я бы порекомендовал взять любую фиксированную перестановку, перестановить цифры, которые можно изменить, и затем вывести результат.Оба они концептуально просты;используйте Fisher-Yates для перетасовки.

Предположим, вместо этого вы хотите создать последовательность различных перестановок, без предварительного вычисления списка всех перестановок.Такой список будет длинным для разумных русских.Если длина вашей последовательности мала по отношению к числу перестановок (n-1) !, то запоминание тех, которые вы уже сгенерировали, и попытка снова и снова, пока вы не получите один из них, не является подходящим.Вам нужно будет определить возможные вероятности, чтобы дать вам хорошее представление о том, что для вас означает «маленький» (ожидаемое время выполнения ухудшается с каждой новой перестановкой, добавляемой в список).Если известно, что число перестановок составляет значительную долю от числа всех возможных перестановок, вероятно, лучше пойти дальше и рассчитать их все заранее, возможно, в сжатом формате, чтобы сэкономить место.

...