Скажем, я хочу создать список чисел рекурсивно, случайно выбрав число от 0 до 9, а затем (необязательно) произвольно выбрать другое число между x + 1 и 9, где x - последнее число, которое было выбрано, и, необязательно, повторение этого процесса. Таким образом, вы можете получить списки, такие как 1,3,6
, 3,4,8,9
, 2,7
и так далее. Это упрощение того, что я действительно пытаюсь сделать.Математически идеальный способ получения равномерной выборки «цепочки» элементов
Для моих целей я не хочу просто выбирать кучу случайных чисел из списка, удалять дубликаты, а затем сортировать их. Это нужно сделать рекурсивно. Проблема в том, что делать это прямо в том, как я описал, не даст всем числам равных шансов. Это будет иметь тенденцию выбирать большее количество больше, чем меньшие. Я попробовал что-то, чтобы противодействовать этому, но затем он слишком много поддерживает маленькие цифры.
Это JavaScript с помощью случайной целого числа функции от Lo-Dash:
function randomlist(index) {
if (index > 8) return;
var range = _.random(9 - index);
var randex = [_.random(index, index + range)];
if (_.random(10) < 6) randex = randex.concat(randomlist(randex[0] + 1));
return randex
}
tally = [0,0,0,0,0,0,0,0,0,0]
for (i=0;i<1000;i++) {
var list = randomlist(0);
list.forEach(function(x){tally[x]+=1});
}
Здесь, а не просто выбирать случайное число между й и 9 и первым выбрать случайный меньший диапазон, а затем выбрать случайное число внутри этого. Я думал, что это может сделать трюк, но когда я запускаю вышеуказанный код, tally
заканчивается тем, что выглядит как [278, 262, 224, 189, 217, 180, 185, 179, 156, 61]
, явно предпочитая меньшие числа. И если я отрегулирую вероятность рекурсии, тогда баланс немного изменится. Я надеюсь, что может быть какая-то формула, которая позволяет настраивать вероятность рекурсии и позволяет создавать списки, которые равномерно проецируют все числа.
Вам не хватает того, что есть более крупные числа, чем маленькие, и поэтому функция случайного числа чаще всего выбирает большие? Возможно, вам стоит подумать обо всех ваших диапазонах чисел, имеющих одинаковое количество цифр - маленькие просто начинаются с 0, например 053 и 008. – vernonner3voltazim
Почему бы не выбрать расстояние между цифрами, а затем вычислить числа с помощью сканирования? По сканированию я имею в виду, что [2,4,1,5,2] становится [2,6,7,12,14]. –
Какое качество вы используете? Вы просто хотите получить однородное выборочное выборочное подмножество первых 10 чисел? Затем на каждом рекурсивном шаге либо берете конкретный элемент, либо нет. – osa