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

Рандом без повторения

09.01.2018, 21:32. Показов 1680. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Мне нужно сделать рандом так, чтобы после 1 сгенерированного числа это число больше не генерировалось. Я думал решить это так.
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
List<int> ispolzovano = new List<int>();
Random rnd = new Random();
bool done = false;
void Button1Click(object sender, EventArgs e)
        {
            
            int value = rnd.Next(1,4);
            if(done == false)
            {
                while(done == false)
                {
                    value = rnd.Next(1,3);
                    if(ispolzovano.Contains(value))
                    {
                        continue;
                    }
                    else
                    {
                        ispolzovano.Add(value);
                        done = true;
                    }
                }
            }
                 }
Но почему-то все равно эту проверку не проходит. В чем же дело?

Добавлено через 13 минут
По-моему я решил проблему!)
нужно после всей этой операции снова ставить done = false для того чтобы он заного проходил операцию while.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.01.2018, 21:32
Ответы с готовыми решениями:

Рандом без повторений
Есть рандом от 1 до 8... Как сделать так, чтобы если рандом выкинул цифру, то после, он ее уже не...

Рандом без повторений
Random part = new Random(); int numb = new int; for (int j = 0; j &lt; numb.Length; j++) ...

Рандом без дубликатов
Добрый день, есть два массива один уже заполнен, второй заполняется рандомом со значениями из...

Псевдо-рандом без повторений
Всем доброго времени суток, появилась такая проблема, нужно приложения с рандомом, но рандом только...

11
8940 / 4852 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
09.01.2018, 21:52 2
B_im, тебе такой алгоритм нужен по заданию или ты другого не придумал? Можно использовать словарь: у него ключи уникальны
0
0 / 0 / 3
Регистрация: 08.01.2018
Сообщений: 25
09.01.2018, 22:16  [ТС] 3
другого не придумал. А что, плохой алгоритм?
0
1519 / 462 / 126
Регистрация: 09.01.2018
Сообщений: 1,094
09.01.2018, 22:28 4
Ну вот так, например, можно

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        List<int> usedNumbers = new List<int>();
        Random random = new Random();
 
        private int GetValidRandomNumber()
        {
            int i;
            do
            {
                i = random.Next();
            } while (usedNumbers.Contains(i));
 
            usedNumbers.Add(i);
            return i;
        }
0
1150 / 742 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
09.01.2018, 22:50 5
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
    class RandomUniq
    {
        private static Random rnd = new Random();
 
        private int[] _values;
 
        private int _position;
 
        public int NumbersLeft { get { return _values.Length - _position; } }
 
        public RandomUniq(int minValue, int maxValue)
        {
            if (minValue >= maxValue)
                throw new ArgumentException("minValue must be lower than maxValue");
 
            _values = Enumerable.Range(minValue, maxValue - minValue).OrderBy(x => rnd.NextDouble()).ToArray();
            _position = 0;
        }
 
        public int Next()
        {
            if (NumbersLeft == 0)
                throw new InvalidOperationException("No more numbers");
 
            return _values[_position++];
        }
    }
}
0
8940 / 4852 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
09.01.2018, 23:06 6
C#
1
2
3
4
5
6
7
8
9
10
static List<int> GetUniqueRandomNumbers(int count, int min, int max)
{
    var dict = new Dictionary<int, int>();
    var rnd = new Random();
    while (dict.Count < count)
    {
        dict[rnd.Next(min, max + 1)]=0;
    }
    return dict.Keys.Select(i=>i).ToList();
}
0
644 / 528 / 324
Регистрация: 20.05.2015
Сообщений: 1,469
10.01.2018, 03:48 7
По-моему ТС хочет отсортировать массив рандомом это можно сделать так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Button1Click(object sender, EventArgs e)
        { 
         List<int>  li = orderNew(new List<int>{1,2,3,4});
}
 
        public List<int> orderNew(List<int> li_old)
        {
            Random rand = new Random();
            List<int> li_new = new List<int>();
 
            for (int i = li_old.Count; i > 0; i--)
            {
                int ind = rand.Next(0, li_old.Count);
                li_new.Add(li_old[ind]);
                li_old.RemoveAt(ind);
            }
            return li_new;
        }
1
Эксперт .NET
12081 / 8389 / 1282
Регистрация: 21.01.2016
Сообщений: 31,601
10.01.2018, 06:01 8
B_im, для таких вещей был придуман Регистр сдвига с линейной обратной связью. На пальцах и с картинками объясняется в статье на хабре о заливке экрана в игре Wolfenstein 3D.
1
644 / 528 / 324
Регистрация: 20.05.2015
Сообщений: 1,469
10.01.2018, 07:21 9
Цитата Сообщение от Usaga Посмотреть сообщение
для таких вещей был придуман Регистр сдвига с линейной обратной связью.
Прикольная реализация правда для колоды карт я бы её не использовал например, потому что из всех возможных комбинаций можно получить лишь столько сколько элементов используется, хотя в действительности их гораздо больше.
0
Эксперт .NET
12081 / 8389 / 1282
Регистрация: 21.01.2016
Сообщений: 31,601
10.01.2018, 07:24 10
Aferuga, данный хитрый алгоритм позволяет вам перебрать всё множество каково бы оно ни было в размере.
0
644 / 528 / 324
Регистрация: 20.05.2015
Сообщений: 1,469
10.01.2018, 08:18 11
Usaga, Согласен что алгоритм хитрый и при больших объемах нам нет смысла использовать все наборы комбинаций, но при небольших объемах эта зависимость будет прослеживаться гораздо проще. Можно конечно рандомизировать сдвиг, но тогда появляется вероятность повторений, а это возвращает нас к while описаным выше.
С while есть другая проблема учитывая что Random зависит от часов и тело цикла небольшое он может успеть выдать по 10 одинаковых чисел подряд (в зависимости от машины) и так по кругу с каждым новым числом.
Цитата Сообщение от Aferuga Посмотреть сообщение
хотя в действительности их гораздо больше.
Если быть точным n! всех возможных комбинаций, где n-количество элементов.
З. Ы. А вообще надо будет взять на заметку такой подход.
0
Эксперт .NET
12081 / 8389 / 1282
Регистрация: 21.01.2016
Сообщений: 31,601
10.01.2018, 08:28 12
Aferuga, что-то я не понял, что вам в регистре сдвига не понравилось) Какая рандомизация сдвига? Зачем? Чему противоречит размер множества?
0
10.01.2018, 08:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.01.2018, 08:28
Помогаю со студенческими работами здесь

Рандом string'ов без повторений
Всех с наступившим Новым Годом! Прошу помочь лишь с количеством букв в конечной строке. Вот...

Убрать повторения объекта без использования LINQ
Здравствуйте, подскажите пожалуйста мне как можно убрать повторяющиеся значения в объекте... к...

colorgrid без повторения
имеется cokorgrid с возможностью выбора fg и bg,как сделать так что бы не возмжео было сразу...

Цикл без повторения
Здравствуйте! Создал примитивную функцию &quot;избранное&quot;: if(isset($_GET)){ $idf =...


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

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