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

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

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

Author24 — интернет-сервис помощи студентам
Доброе время суток.Есть 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.02.2012, 01:11
Ответы с готовыми решениями:

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

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

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

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

28
112 / 112 / 22
Регистрация: 26.12.2008
Сообщений: 166
10.02.2012, 01:12 2
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
всё равно числа одинковые

Добавлено через 3 минуты
уже всё сделал)
0
112 / 112 / 22
Регистрация: 26.12.2008
Сообщений: 166
10.02.2012, 03:05 4
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 5
Дело в том что рандом - на самом деле не рандом. Это последовательность, которая генерируется в зависимости от текущего времени. А текущее время обновляется раз в 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
4091 / 3825 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
10.02.2012, 12:56 6
Цитата Сообщение от 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 7
Это не совет а просто как вариант
Мне вообще неясно, зачем несколько раз создавать экземпляр рандома.
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
10.02.2012, 13:06 8
turbanoff
У рандома есть "правильный" конструктор, которому можно передать например DateTime.Now.Ticks
Дефолтный конструктор класса Random использует именно это значение по умолчанию.
1
Эксперт Java
4091 / 3825 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
10.02.2012, 13:18 9
Цитата Сообщение от 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
340 / 340 / 90
Регистрация: 04.03.2010
Сообщений: 648
10.02.2012, 13:41 10
Цитата Сообщение от turbanoff Посмотреть сообщение
Первые 2 числа всегда одинаковы, остальные разные.
на моей машине получилось, что и вторые два числа одинаковые
1
Эксперт Java
4091 / 3825 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
10.02.2012, 14:07 11
Цитата Сообщение от andrew_w2k Посмотреть сообщение
на моей машине получилось, что и вторые два числа одинаковые
Ну значить стоит сделать Random, как синглтон в своей программе, и не выдумывать лишних приблуд.
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
10.02.2012, 16:17 12
Цитата Сообщение от turbanoff Посмотреть сообщение
дефолтный конструктор использует Environment.TickCount
Да, вы правы. Спасибо за исправление.
Разницы, в принципе, никакой. Разве что при частом создании генератора путем использования дефолтного конструктора последовательности будут генерироваться одинаковые каждые 25 дней.
0
6 / 6 / 0
Регистрация: 15.04.2010
Сообщений: 34
29.10.2012, 15:13 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 14
спасибо за класс, как раз нужен был

класс возвращает случайное число не в промежутке между minValue и maxValue, а от нуля до разницы между ними. Чтобы это исправить измените в методе genList
Цитата Сообщение от kiss_a Посмотреть сообщение
for (int i = 0; i < _max - _min; i++)
на
C#
1
for (int i = _min; i < _max; i++)
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
02.09.2013, 15:46 15
Здорово этот класс будет работать, если надо генерить неповторяемые числа на всем диапазоне int.
0
6 / 6 / 0
Регистрация: 15.04.2010
Сообщений: 34
03.09.2013, 11:49 16
Спасибо ilexandr за исправление. Много где использую данный класс, а ошибки этой не видел.
0
0 / 0 / 0
Регистрация: 05.11.2014
Сообщений: 31
01.06.2015, 20:02 17
kiss_a,
использовал Ваш класс, но все равно цифры повторяются...
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
01.06.2015, 20:38 18
Цитата Сообщение от 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 19
Просто сделай так
C#
1
static Random random = new Random(DateTime.Now.Millisecond);
1
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
17.01.2017, 10:22 20
Цитата Сообщение от HakerHan Посмотреть сообщение
Просто сделай так
Цитата Сообщение от lFreeManl Посмотреть сообщение
генерирование разных (неповторяющихся) чисел
Не так-то просто.
1
17.01.2017, 10:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.01.2017, 10:22
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru