Заполнение массива случайных чисел минимальными спейсерами / распределением? - PullRequest
5 голосов
/ 05 февраля 2011

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

Я заполнил массив 5 случайными числами от 0 до 100:

private var myArray:Array = new Array();

for (var i:uint = 0; i < 5; i++)
    myArray.push(Math.round(Math.random() * 100));

далее я отсортировал массив в числовом порядке:

myArray.sort(Array.NUMERIC);

после заполнения и сортировки предположим, что myArray теперь содержит эти значения:

26, 27, 42, 92, 97

Теперь я хотел бы, чтобы некоторые или все значения массива были сброшены, если они должны быть такими, чтобы они были как минимум на определенный процент (скажем, 10%) от максимального значения (100) друг от друга. .

первые 2 значения (26 и 27) находятся на расстоянии не менее 10%, равно как и последние 2 значения (92 и 97). однако, если я просто переместил значение 27 на 10% из 26, так что 27 изменится на 37, 37 теперь конфликтует со следующим значением 42.

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

это может быть само собой разумеющимся, но я ищу решение, которое переносимо, где максимальные значения и минимальные проценты распределения могут быть любыми, не только для моего примера выше.

Ответы [ 2 ]

7 голосов
/ 05 февраля 2011

В вашем случае вам нужно 5 номеров, все как минимум 10 друг от друга.Что вам нужно сделать, это создать 5 чисел от 0 до 60, отсортировать их, а затем начать добавлять делители. Так что, если ваш первоначальный список 26, 27, 42, 52, 57, то ваш новый список 26, 27+10, 42+20, 52+30, 57+40 или 26, 37, 62, 82, 97.

Это может быть обобщено на любой желаемый диапазон, количество элементов и размер делителя.Если вы хотите, чтобы n элементов имели по крайней мере d, разделяя их в диапазоне от x до y, то заполните n элементов в диапазоне (x, y - (n-1) * d), отсортируйте их и начните добавлять разделители.

0 голосов
/ 05 февраля 2011

если вы знаете процентную дельту для каждого значения переменной (например, 10%) и минимального значения (0%, 20%, 40%, 60%, 80%), вы также знаете значение 100% (назовем его base = 100 ), тогда вы сгенерируете свой массив следующим образом: var array: Array = new Array(Math.round(Math.random() * 0.1 * base), Math.round(Math.random() * 0.1 * base) + 0.2 * base, Math.round(Math.random() * 0.1 * base) + 0.4 * base, Math.round(Math.random() * 0.1 * base) + 0.6 * base, Math.round(Math.random() * 100) + 0.8 * 0.1 * base);

...