Я хочу генерировать 25 уникальных случайных чисел и перечислить их в консоли. Числа должны быть по крайней мере 10 символами долго. Какой-либо простой способ сделать это?
Попробуйте построить числа в виде строк и использовать 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 и новее.
Проблема немного в "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)
.
Поскольку ваши числа настолько длинные, вам не стоит беспокоиться о дубликатах. Они очень маловероятны.
Один простой способ заключается в следующем:
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, который я использовал выше.
Есть большая разница между Случайностью и Уникальностью.
Итак, если вам действительно нужны уникальные номера, вы должны убедиться, что вы где-то сохранили все уже созданные номера и проверить, нет ли вашего вновь созданного в этом списке, или вы должны предоставить некоторый алгоритм, который гарантирует, что данное число не может быть создано дважды.
Чтобы заставить вторую часть работать, вы в основном берете дату / время момента создания, потому что текущая пара дата / время уникальна навсегда. Единственная проблема заключается в том, сколько у вас созданий на (милли) секунду и сколько цифр доступно для хранения вашего уникального номера.
Пример использования 12 цифр сделан здесь . Надеюсь это поможет.
Random rnd = new Random(table);
for(int i = 0; i < 25; ++i) {
Console.WriteLine("{0}", rnd.Next(50, 50+i)
}