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

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

10.02.2012, 01:11. Показов 56494. Ответов 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
 Аватар для Prorok
112 / 112 / 22
Регистрация: 26.12.2008
Сообщений: 166
10.02.2012, 01:12
C#
1
2
3
Random n = new Random();
 int i = n.Next(0, 7);
 int j = n.Next(0, 7);
0
10 / 10 / 1
Регистрация: 27.11.2011
Сообщений: 153
10.02.2012, 01:23  [ТС]
всё равно числа одинковые

Добавлено через 3 минуты
уже всё сделал)
0
 Аватар для Prorok
112 / 112 / 22
Регистрация: 26.12.2008
Сообщений: 166
10.02.2012, 03:05
C#
1
2
3
Random n = new Random();
 int i = n.Next(0, 7);
 int j = n.Next(0, 7);
Цитата Сообщение от lFreeManl Посмотреть сообщение
всё равно числа одинковые
они не могут быть одинаковыми, потому что никогда не могут!

хотя, если вы чертовски удачливы, то могут.
1
146 / 143 / 32
Регистрация: 21.01.2012
Сообщений: 545
10.02.2012, 12:46
Дело в том что рандом - на самом деле не рандом. Это последовательность, которая генерируется в зависимости от текущего времени. А текущее время обновляется раз в 18 мс(если не ошибаюсь). То есть если генерация второй последовательности проиходит раньше чем прошло 18 мс с момента генерации предыдущей(а у тебя так и есть), то последовательности будут равны. Как вариант
C#
1
2
3
4
5
Random n = new Random();
 int i = n.Next(0, 7);
Thread.Sleep(20);
 Random m = new Random();
 int j = m.Next(0, 7);
1
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
10.02.2012, 12:56
Цитата Сообщение от KeBJIaP Посмотреть сообщение
Дело в том что рандом - на самом деле не рандом. Это последовательность, которая генерируется в зависимости от текущего времени. А текущее время обновляется раз в 18 мс(если не ошибаюсь). То есть если генерация второй последовательности проиходит раньше чем прошло 18 мс с момента генерации предыдущей(а у тебя так и есть), то последовательности будут равны. Как вариант
C#
1
2
3
4
5
Random n = new Random();
 int i = n.Next(0, 7);
Thread.Sleep(20);
 Random m = new Random();
 int j = m.Next(0, 7);
какой ужасный совет.
У рандома есть "правильный" конструктор, которому можно передать например DateTime.Now.Ticks
1
146 / 143 / 32
Регистрация: 21.01.2012
Сообщений: 545
10.02.2012, 13:00
Это не совет а просто как вариант
Мне вообще неясно, зачем несколько раз создавать экземпляр рандома.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
10.02.2012, 13:06
turbanoff
У рандома есть "правильный" конструктор, которому можно передать например DateTime.Now.Ticks
Дефолтный конструктор класса Random использует именно это значение по умолчанию.
1
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
10.02.2012, 13:18
Цитата Сообщение от kolorotur Посмотреть сообщение
turbanoff

Дефолтный конструктор класса Random использует именно это значение по умолчанию.
Хм. Вот код
C#
1
2
3
4
5
6
7
            Random r1 = new Random();
            Random r2 = new Random();
            Random r3 = new Random((int)DateTime.Now.Ticks);
            Random r4 = new Random((int)DateTime.Now.Ticks);
 
            Console.WriteLine(r1.Next() + " " + r2.Next() + " " + r3.Next() + " " + r4.Next());
            Console.ReadKey();
Первые 2 числа всегда одинаковы, остальные разные.

PS. Посмотрел: дефолтный конструктор использует Environment.TickCount
5
 Аватар для andrew_w2k
341 / 341 / 90
Регистрация: 04.03.2010
Сообщений: 648
10.02.2012, 13:41
Цитата Сообщение от turbanoff Посмотреть сообщение
Первые 2 числа всегда одинаковы, остальные разные.
на моей машине получилось, что и вторые два числа одинаковые
1
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
10.02.2012, 14:07
Цитата Сообщение от andrew_w2k Посмотреть сообщение
на моей машине получилось, что и вторые два числа одинаковые
Ну значить стоит сделать Random, как синглтон в своей программе, и не выдумывать лишних приблуд.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
10.02.2012, 16:17
Цитата Сообщение от turbanoff Посмотреть сообщение
дефолтный конструктор использует Environment.TickCount
Да, вы правы. Спасибо за исправление.
Разницы, в принципе, никакой. Разве что при частом создании генератора путем использования дефолтного конструктора последовательности будут генерироваться одинаковые каждые 25 дней.
0
6 / 6 / 0
Регистрация: 15.04.2010
Сообщений: 34
29.10.2012, 15:13
Я использую данный класс, который не выдает повторений:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
using System;
using System.Collections.Generic;
using System.Text;
 
namespace Random
{
    public class RandomNotRepeat : System.Random
    {
        int _min, _max;
        Stack<int> list;
        /// <summary>
        /// Инициализирует новый экземпляр класса System.Random с помощью зависимого
        //  от времени начального значения по умолчанию.
        /// </summary>
        /// <param name="min">Включенной нижний предел возвращаемого случайного числа.</param>
        /// <param name="max">Исключенный верхний предел возвращаемого случайного числа. Значение maxValue должно быть больше или равно значению minValue.</param>
        public RandomNotRepeat(int minValue, int maxValue)
        {
            _max = maxValue;
            _min = minValue;
            genList();
        }
        /// <summary>
        /// Генерация списка исключений
        /// </summary>
        protected void genList()
        {
            System.Random rand = new System.Random();
            List<int> temp = new List<int>();
            for (int i = 0; i < _max - _min; i++)
            {
                temp.Add(i);
            }
            list = new Stack<int>();
            while (temp.Count > 0)
            {
                int addInt = temp[rand.Next(0,temp.Count)];
                list.Push(addInt);
                temp.Remove(addInt);
            }
        }
        /// <summary>
        /// Возвращает неотрицательное случайное число.
        /// </summary>
        /// <returns>32-разрядное целое число со знаком большее или равное minValue и меньше, чем maxValue; то есть, диапазон возвращаемого значения включает minValue, не включает maxValue. Если значение параметра minValue равно значению параметра maxValue, то возвращается значение minValue.</returns>
        public override int Next()
        {
            if (list.Count > 0)
            {
                return list.Pop();
            }
            else
            {
                genList();
            }
            return list.Pop();
        }
        
    }
}
4
ilexandr
02.09.2013, 14:01
спасибо за класс, как раз нужен был

класс возвращает случайное число не в промежутке между minValue и maxValue, а от нуля до разницы между ними. Чтобы это исправить измените в методе genList
Цитата Сообщение от kiss_a Посмотреть сообщение
for (int i = 0; i < _max - _min; i++)
на
C#
1
for (int i = _min; i < _max; i++)
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
02.09.2013, 15:46
Здорово этот класс будет работать, если надо генерить неповторяемые числа на всем диапазоне int.
0
6 / 6 / 0
Регистрация: 15.04.2010
Сообщений: 34
03.09.2013, 11:49
Спасибо ilexandr за исправление. Много где использую данный класс, а ошибки этой не видел.
0
0 / 0 / 0
Регистрация: 05.11.2014
Сообщений: 31
01.06.2015, 20:02
kiss_a,
использовал Ваш класс, но все равно цифры повторяются...
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
01.06.2015, 20:38
Цитата Сообщение от Bloodik-vm Посмотреть сообщение
все равно цифры повторяются...
Попробуйте так.
Класс.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.Security.Cryptography;
 
namespace CustomRandom {
    class RandomGenerator {
        RNGCryptoServiceProvider generator = null;
        public RandomGenerator() {
            generator = new RNGCryptoServiceProvider();
        }
        public uint NextInt() {
            byte[] data = new byte[10];
            generator.GetBytes(data);
            return (uint)data.GetHashCode();
        }
        public ushort NextShort() {
            byte[] data = new byte[10];
            generator.GetBytes(data);
            return (ushort)data.GetHashCode();
        }
    }
}
Использование.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace CustomRandom {
    class Program {
        static void Main(string[] args) {
            RandomGenerator generator = new RandomGenerator();
            uint i = generator.NextInt();
            uint j = generator.NextInt();
            ushort k = generator.NextShort();
            ushort l = generator.NextShort();
            Console.WriteLine("i = {0}, j = {1}\nk = {2}, l = {3}", i, j, k, l);
            Console.ReadLine();
        }
    }
}
1
2 / 2 / 0
Регистрация: 14.07.2016
Сообщений: 36
17.01.2017, 10:12
Просто сделай так
C#
1
static Random random = new Random(DateTime.Now.Millisecond);
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
17.01.2017, 10:22
Цитата Сообщение от HakerHan Посмотреть сообщение
Просто сделай так
Цитата Сообщение от lFreeManl Посмотреть сообщение
генерирование разных (неповторяющихся) чисел
Не так-то просто.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.01.2017, 10:22
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru