Генерация нескольких случайных чисел

Я хочу генерировать 25 уникальных случайных чисел и перечислить их в консоли. Числа должны быть по крайней мере 10 символами долго. Какой-либо простой способ сделать это?

8
задан skaffman 5 June 2010 в 22:25
поделиться

5 ответов

Попробуйте построить числа в виде строк и использовать HashSet для обеспечения их уникальности:

Random random = new Random();
HashSet<string> ids = new HashSet<string>();

while (ids.Count < 25)
{
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 10; ++i)
    {
        sb.Append(random.Next(10));
    }
    ids.Add(sb.ToString());
}

Пример вывода:

7895499338
2643703497
0126762624
8623017810
...etc...

Класс HashSet присутствует в .NET 3.5 и новее.

13
ответ дан 5 December 2019 в 12:08
поделиться

Проблема немного в "25 уникальных случайных". Вывести 25 случайных чисел так же просто, как

Random r = new Random();
for(int i=0; i<25; i++)
    Console.WriteLine(r.Next(1,100).ToString());

Однако они не обязательно уникальны. Если вы не хотите допускать дубликатов, вам нужно как-то хранить ранее сгенерированные числа, и бросать снова, если вы попали на старое.

Имейте в виду, что таким образом вы изменяете распределение вероятностей сгенерированных чисел.

Edit: Я только что заметил, что эти числа должны быть длиной в десять символов. Поскольку 9,999,999,999 превышает Int32.MaxValue, я бы предложил использовать Math.Floor(r.NextDouble() * 100000000 + 1000000000) вместо r.Next(1,100).

Поскольку ваши числа настолько длинные, вам не стоит беспокоиться о дубликатах. Они очень маловероятны.

2
ответ дан 5 December 2019 в 12:08
поделиться

Один простой способ заключается в следующем:

class Test
{
    private static void Main()
    {
        Random rand = new Random();

        for (int i = 0; i < 25; ++i)
        {
            Console.WriteLine(rand.Next(1000000000, int.MaxValue));
        }
    }
}

Это гарантирует, что номера всегда будут длиной 10 символов (цифр). Однако они не обязательно будут уникальными. Если вы хотите, чтобы они точно были уникальными, вам придется сделать что-то вроде этого:

class Test
{
    private static void Main()
    {
        Random rand = new Random();

        var generatedSoFar = new HashSet<int>();
        for (int i = 0; i < 25; ++i)
        {
            int newRand;
            do
            {
                newRand = rand.Next(1000000000, int.MaxValue);
            } while (generatedSoFar.Contains(newRand)); // generate a new random number until we get to one we haven't generated before

            generatedSoFar.Add(newRand);

            Console.WriteLine(newRand);
        }
    }
}

Если вы хотите иметь возможность иметь более десяти цифр, вы генерируете количество цифр случайным образом между 10 и вашим максимальным количеством цифр. Затем сгенерируйте каждую цифру (или группу цифр) случайным образом в StringBuilder или List. Для обеспечения уникальности можно использовать тот же метод HashSet, который я использовал выше.

0
ответ дан 5 December 2019 в 12:08
поделиться

Есть большая разница между Случайностью и Уникальностью.

Итак, если вам действительно нужны уникальные номера, вы должны убедиться, что вы где-то сохранили все уже созданные номера и проверить, нет ли вашего вновь созданного в этом списке, или вы должны предоставить некоторый алгоритм, который гарантирует, что данное число не может быть создано дважды.

Чтобы заставить вторую часть работать, вы в основном берете дату / время момента создания, потому что текущая пара дата / время уникальна навсегда. Единственная проблема заключается в том, сколько у вас созданий на (милли) секунду и сколько цифр доступно для хранения вашего уникального номера.

Пример использования 12 цифр сделан здесь . Надеюсь это поможет.

1
ответ дан 5 December 2019 в 12:08
поделиться
 Random rnd = new Random(table);
 for(int i = 0; i < 25; ++i) {
   Console.WriteLine("{0}", rnd.Next(50, 50+i) 
 }
-2
ответ дан 5 December 2019 в 12:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: