Считем максимальное расстояние между цифрами => (20-10)/5=2
Дальше к меньшему числу минус 1 ( 10-1) прибавляем случайное число в диапазоне 1…максимальное расстояние+1. Пишем в первую позицию массива. К получившемуся числу опять прибавляем случайное пишем во вторую позицию. Повторяем до заполнения массива.
Проверить не вышла ли последняя цифра массива за максимальнуюю. Если вышла - перегенерить. За пару раз точно уложиться.
Мне алгоритм понравился, но что-то не так:
- 9 + (1 + 1 + 1) = 9 + 3 = 12 // Случайное 1
- 12 + (1 + 0 + 1) = 12 + 2 = 14 // Случайное 0
- 14 + (1 + 2 + 1) = 14 + 4 = 18 // Случайное 2
- 18 + (1 + 1 + 1) = 18 + 3 = 21 // Случайное 1, вышли за границу.
- не имеет смысла
Может быть последний +1 не вставлять, тогда (вроде бы) должны уложиться в диапазон 10…20?
А, это я не правильно понял уравнение )))
Прошу прощения.
Вот так получается:
- 9 + (1 + 1) = 9 + 2 = 11 // Случайное 1
- 11 + (0 + 1) = 11 + 1 = 12 // Случайное 0
- 12 + (2 + 1) = 12 + 3 = 15 // Случайное 2
- 15 + (2 + 1) = 15 + 3 = 18 // Случайное 2
- 18 + (1 + 1) = 18 + 2 = 20 // Случайное 1
Результат: 11, 12, 15, 18, 20 (и даже отсортирован )
ЗЫ: Я использовал случайное 0 (ноль), в формуле выше такого не было. Это допустимо?
Хм…
Берём кратно больший массив(если надо m[50], берём m[500]) где значения ячеек равны номеру(то есть просто 0 1 2 3 4 5…)
Перетасовываем “колоду” и достаём случайные значения 50 раз. Либо просто каждую 10ую ячейку.Искомый массив готов!
Стопе, ща
Создть массив[40,41…160] из 159-40=119 элементов.
Перетасовать.
Вытащить 50 значений в новый массив.
Я о таком тоже думал, но как “тасовать” не придумал ))
Числа не должны повторяться
В цикле (X от 0 до N) перебираем последовательно все элементы массива.
- Берем ячейку(X) и меняем его со случайной ячейкой(random(0…N)) местами.
осталось узнать, а для чего это понадобилось?
Мы ж как самураи: цель не важна, главное путь!)
Открывайте ютуб и смотрите как тусуется колода. Можно две карты менять местами попарно. Можно менять кортежами (последовательность некоторых чисел) из одного места массива в другой. Можно менять кортежами с разной размерностью, сначала по одной, потом по два, по три и так далее.
ПС: Или так https://www.youtube.com/watch?v=NrxWeJ25ilc
Зачем случайную . Меняем первую со второй, потому что расстояние между ними 1. Следующий обмен производить между числами с расстоянием 2. И так сделать 100 обменов подряд. Нужно использовать кучу различных методик обмена чисел. И выбирать их например в зависимости от текущей секунды в реальном времени запуска программы. Да хоть от millis.
Например, для m = 10 , X 0 = a = c = 7 получим последовательность 7 , 6 , 9 , 0 , 7 , 6 , 9 , 0 , …
Не подходит (повторяются).
Заинтриговал? О как! Сам в шоке ))
Если бы данный вопрос задал свежезарегистрированный человек, то я бы предположил, что это задача из домашнего задания какого-нить студента.
Но в данном случае мне тоже интересно, для чего это.
мне как-то понадобился массив в 4к рандомных значений, но через RANDOM() сделать это с хорошим распределением не удалось
Строго говоря, таких не существует.
Но можно написать класс, который будет реализовать функции “массива переменной длины”.
Это несовместимые условия: “случайные” и “не должны повторяться” это взаимоисключающие требования.
Но если требуется массив уникальных чисел в случайном порядке, то проще всего сначала заполнить массив последовательными числами, а затем случайным образом перемешать его.
Нет такой проблемы: диапазон M…M+N входит в диапазон M…K, поэтому условия задачи в точности выполнены.
Если же требуется реализовать какую-то заранее назначенную выборку, то именно эту выборку и следует помещать в массив до перемешивания. Ну, например, помещать только каждое третье число, либо три из пяти (1,2,4,6,7,9…), после чего перемешать.
Все верно, формально, условия задачи соблюдены. Но я считаю не правильным сокращать диапазон случайных значений в угоду более простому решению. В любом случае подходящий алгоритм будет выбирать @BOOM
А если применить другой генератор псевдорандомных чисел, который гарантированно при N вызовах не будет давать повторяющихся значений?