
Другие языки программирования и технологии
Правильно я сделал выработку неповторяющихся случайных чисел в диапазоне N?С интернета брал подпрограммки.
Но иногда программа виснет. Точно знаю что дело в ГСЧ


НЕ знаток!
если я правильно понимаю как это работает, ГСЧ обычный (т. е. просто отдает случайное число) и прога отвисает через какое-то время то возможная проблема - ГСЧ не может попасть в неповторяющееся число. Допустим у вас есть уже 35 чисел и нужно последнее и допустим это 1, сколько генераций спустя вы получите его? и эта ситуация тем хуже, чем ближе конец диапазона/меньше чисел для генерации осталось. Можно попробовать костыль (но только для последнего числа) в виде суммы всех чисел в указанном диапазоне, от которой, в блоке .a45, отнимать записанный рандом и при достижении последнего числа не мучать ГСЧ а писать остаток от суммы в блоке .ext4, а в условии выхода 36 поменять на 35. но вообще есть другой способ
однако есть у вас ещё пара нюансов: по метке .a46 вы сначала сравниваете число в банке со случайным, а затем только с индексом текущего генерируемого. и тут вопрос а почему не наоборот? если индекс проверяемого равен индексу генерируемого, то в банке на его месте явно "пусто" и сравнивать не счем и незачем, т. е. при их равенстве можно смело писать число без проверки на повтор.
так же можно избежать одного прыга если код по метке .a451 расположить в конце блока .a46
если я правильно понимаю как это работает, ГСЧ обычный (т. е. просто отдает случайное число) и прога отвисает через какое-то время то возможная проблема - ГСЧ не может попасть в неповторяющееся число. Допустим у вас есть уже 35 чисел и нужно последнее и допустим это 1, сколько генераций спустя вы получите его? и эта ситуация тем хуже, чем ближе конец диапазона/меньше чисел для генерации осталось. Можно попробовать костыль (но только для последнего числа) в виде суммы всех чисел в указанном диапазоне, от которой, в блоке .a45, отнимать записанный рандом и при достижении последнего числа не мучать ГСЧ а писать остаток от суммы в блоке .ext4, а в условии выхода 36 поменять на 35. но вообще есть другой способ
однако есть у вас ещё пара нюансов: по метке .a46 вы сначала сравниваете число в банке со случайным, а затем только с индексом текущего генерируемого. и тут вопрос а почему не наоборот? если индекс проверяемого равен индексу генерируемого, то в банке на его месте явно "пусто" и сравнивать не счем и незачем, т. е. при их равенстве можно смело писать число без проверки на повтор.
так же можно избежать одного прыга если код по метке .a451 расположить в конце блока .a46
Похожие вопросы
- линейный массив из 20 элементов заполнить случайными числами в диапазоне от 0 до 1000 и отсортировать по возрастанию
- как сделать массив из случайных чисел от 1 до 15 (размерность массива 4х4) что бы они не повторялись в VBA????
- Пишу программу-лото на с (НЕ с++ или с#). Как сделать, чтобы генерировались случайные числа, кроме уже выпавших?
- Excel. Как сделать критерий "ЕСЛИ" от двух чисел? Если хоть одно из них удовлетворяет указанному числу или диапазону?
- Задан массив m на n. Числа m и n вводятся вручную. Заполнить массив случайным образом. Найти произведение чисел от 10 до
- Генератор Случайных Чисел
- 1.Заполнить массив случайными числами. Вывести элементы массива на экран. Заменить все его минимальные элементы нулями.
- Массив заполнен случайными величинами в диапазоне от -30 до 29 и состоит из N элементов. Подсчитать сколько в нём
- c++, как отрандомить случайное число типа float в диапазоне от 0 до 10 ? (пример - 0,42; 7,71)
- как представить число в двоичном n-разрядном представлении