Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.81/267: Рейтинг темы: голосов - 267, средняя оценка - 4.81
10 / 10 / 1
Регистрация: 27.11.2011
Сообщений: 153

Random: генерирование разных (неповторяющихся) чисел

10.02.2012, 01:11. Показов 56711. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток.Есть 2 события которые рандомно генерируют числа,но только эти числа сходятся,то есть если 1й сгенерировал 3 то и 2й тоже выдаст 3.
C#
1
2
3
4
Random n = new Random();
 int i = n.Next(0, 7);
 Random m = new Random();
 int j = m.Next(0, 7);
Как сделать что бы числа были разными?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.02.2012, 01:11
Ответы с готовыми решениями:

Через Random получить 3 неповторяющихся числа
Как через Random получить 3 неповторяющихся числа?

Random 3 разных случайных числа
как сделать правильнее? вроде сделал но значения одинаковые( SetCurrentTaskNumberPartC(); labPartC.Text="Задания...

Генерирование случайных чисел
Через Next() надо вывести случайные числа от 2 до 11, но кроме 5. Я сделал массив, и как этот массив вставить в Next()? Или как это можно...

28
2 / 2 / 0
Регистрация: 14.07.2016
Сообщений: 36
17.01.2017, 11:31
Студворк — интернет-сервис помощи студентам
kolorotur, а как? Если можно скажи как правильно будет. Заранее благодарю.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18399 / 14330 / 5370
Регистрация: 17.03.2014
Сообщений: 29,006
Записей в блоге: 1
17.01.2017, 12:22
HakerHan, недостаток приведенного тобой решения состоит в использовании миллисекунд для затравки. Это означает всего 1000 возможных значений которые к тому же могут повторяться. Конструктор класса Random не зря использует Environment.TickCount с большим диапазоном значений и меньшим риском повторений.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
17.01.2017, 12:42
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Это означает всего 1000 возможных значений
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Environment.TickCount с большим диапазоном значений и меньшим риском повторений.
Зерно (Seed) не влияет на диапазон генерируемых значений — они всегда генерируются с равномерным распределением, а диапазон указывается отдельно.
Правильнее было бы сказать, что это означает всего лишь 1000 возможных последовательностей, а не значений в принципе.

Добавлено через 13 минут
Цитата Сообщение от HakerHan Посмотреть сообщение
а как? Если можно скажи как правильно будет.
Правильность, к сожалению, зависит от конкретной задачи, т.к. при генерировании неповторяющихся чисел есть масса возможных решений, но в каждом придется чем-то жертвовать:
  • Процессорным временем
  • Памятью
  • Возможностью выбирать диапазон значений
  • Нужным распределением
  • Различными комбинациями из вышеперечисленного
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18399 / 14330 / 5370
Регистрация: 17.03.2014
Сообщений: 29,006
Записей в блоге: 1
17.01.2017, 13:10
Цитата Сообщение от kolorotur Посмотреть сообщение
Правильнее было бы сказать, что это означает всего лишь 1000 возможных последовательностей, а не значений в принципе.
Я это и имел в виду. Неудачно выразился. Спасибо за поправку. Нужно еще добавить что 1000 это теоретический предел. На практике это число может быть меньше. Написал вот такой простой тест
C#
1
2
3
4
5
6
HashSet<int> h = new HashSet<int>();
for (long i = 0; i < 1000000000L*3; i++)
{
    h.Add(DateTime.Now.Millisecond);
}
Console.WriteLine(h.Count);
Он выполнялся 9 минут и выдал 230.
1
298 / 260 / 108
Регистрация: 26.10.2012
Сообщений: 810
17.01.2017, 13:46
Чтобы гарантированно не повторялись можно сделать так:
C#
1
2
3
var random = new Random();
var value1 = random.Next(0, 8);
var value2 = (value1 + random.Next(1, 8)) % 8;
Или если надо получить последовательность не повторяющихся чисел.
Можно взять массив, случайно его перемешать и брать его элементы по порядку
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static class Extender
{
public static void RandomSort<T>(this IList<T> list) {
            for (int i = list.Count, im = i - 1; i > 1; i = im, im--) {
                int j = MyRandom.Range(i);
 
                T temp = list[im];
                list[im] = list[j];
                list[j] = temp;
            }
        }
}
//.....
var array = Enumerable.Range(0, 8).ToArray();
array.RandomSort();
var value1 = array[0];
var value2 = array[1];
1
0 / 0 / 0
Регистрация: 15.11.2016
Сообщений: 4
16.12.2017, 04:50
Дело все в том, господа, что Random нужно делать статичным.
Например:
C#
1
2
3
4
5
6
7
...
static Random rng = new Random();
static int GetRand()
{
return rng.Next(0, 7)
}
...
Затем присвой переменным значения:
C#
1
2
3
4
...
int i = GetRand();
int j = GetRand();
...
Всё!
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
16.12.2017, 10:57
Цитата Сообщение от therevived Посмотреть сообщение
Дело все в том, господа, что Random нужно делать статичным.
Это еще на первой странице ответили
2
0 / 0 / 0
Регистрация: 15.11.2016
Сообщений: 4
24.12.2017, 11:46
Да... Ну ладно, лишним не будет. 99,9%, что ленивые задницы (вроде меня) просто пролистают вниз
0
0 / 0 / 0
Регистрация: 12.11.2018
Сообщений: 1
12.11.2018, 13:27
Не совсем в курсе, может что-то изменилось в классе рандом за пару лет, но запись
C#
1
2
3
4
5
Random rnd = new Random();
        for (int i = 0; i < 20; i++)
        {
            Console.WriteLine(rnd.Next(0,7));
        }
вполне не повторяет значения (но бывают случаи, когда "очень удачливо" следуют одинаковые цифры одна за другой).
Однако, правда, что при создании нового объекта/экземпляра класса Random, числа будут повторяться, если этот экземпляр был создан после предыдущего не позднее 18-20мс. Вот проверьте:
C#
1
2
3
4
5
       Random rnd = new Random();
        for (int i = 0; i < 20; i++)
        {
            Console.WriteLine(rnd.Next() + " " + new Random().Next());
        }
Такое (быстрое создание экземпляров) может быть:
1) Как в текущем примере, т.е. внутри цикла одной из функций/метода программы;
2) При создании нового экземпляра любого другого класса, внутри которого есть переменная класса Random.

Как это исправить, чтобы числа генерировались все-таки разные:
1) Создайте только один единственный общедоступный и статический экземпляр класса Random в главном исполнительном классе и используйте ссылку на него при каждой генерации любого другого числа в любой части программы (что как по мне самый универсальный способ применения)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Program
{
    public static Random Rnd { get; } = new Random();
 
    static void Main(string[] args)
    {
        for (int i = 0; i < 20; i++)
        {
            int num1 = Rnd.Next(10000);
            int num2 = Rnd.Next(10000);
            int num3 = Rnd.Next(10000);
            AnyNum num4 = new AnyNum();
            AnyNum num5 = new AnyNum();
            Console.WriteLine("{0:0000} {1:0000} {2:0000} {3:0000} {4:0000}", num1, num2, num3, num4.Num, num5.Num);
        }
    }
}
 
public class AnyNum
{
    public int Num { get; }
 
    public AnyNum()
    {
        this.Num = Program.Rnd.Next(10000);
    }
}
2) Если у вас есть класс со своим полем класса Random, то он однозначно должен быть статическим, чтобы оно было единственным экземпляром для всех объектов вашего класса
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Program
{
    static void Main(string[] args)
    {
        for (int i = 0; i < 20; i++)
        {
            AnyNum num1 = new AnyNum();
            AnyNum num2 = new AnyNum();
            AnyNum num3 = new AnyNum();
            Console.WriteLine("{0:0000} {1:0000} {2:0000}", num1.Num, num2.Num, num3.Num);
        }
    }
}
 
public class AnyNum
{
    private static Random Rnd { get; } = new Random();
    public int Num { get; }
 
    public AnyNum()
    {
        this.Num = Rnd .Next(10000);
    }
}
Вывод: при генерации случайных чисел следите за тем, чтобы не было многократного создания объектов класса Random в короткий промежуток времени, а лучше всего лишите себя такой "возможности", используя лишь один объект-генератор СЧ во всей вашей программе.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.11.2018, 13:27

Генерирование и перемешивание чисел
Необходимо сгенерировать бесповторные числа определенного количества (=количеству букв в слове) и перемешать их Пример: Привет ...

Генерирование случайных чисел
Пишу плеер, хочу сделать режим случайного воспроизведение музыки... делаю это так: private void button4_Click(object sender,...

Генерирование вещественных случайных чисел
Преподавательница сказала чтобы массив рандомно заполнялся. А в задании сказано, что массив ещё из вещественных чисел состоит. Как тогда...

Генерирование случайных чисел double
Как сгенерировать рандомные значение double в диапазоне ??

Массив неповторяющихся чисел
подскажите как это можно сделать


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru