Генерация нескольких случайных чисел - PullRequest
8 голосов
/ 31 мая 2010

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

Ответы [ 5 ]

13 голосов
/ 31 мая 2010

Попробуйте построить числа в виде строк и используйте 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 и новее.

2 голосов
/ 31 мая 2010

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

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

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

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

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

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

1 голос
/ 31 мая 2010

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

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

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

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

0 голосов
/ 31 мая 2010

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

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 голосов
/ 31 мая 2010
 Random rnd = new Random(table);
 for(int i = 0; i < 25; ++i) {
   Console.WriteLine("{0}", rnd.Next(50, 50+i) 
 }
...