Rand с различной вероятностью?

Здравствуй мой любимый хаб «ненормальное программирование»

Сейчас я вам подкину задачку на сообразительность.

Условие: есть последовательность, от 1 до 100, необходимо выбрать случайным образом число из этой последовательности, но так, что бы у 1 был наименьший приоритет выбора а у 100 максимальный.


Решение у меня есть (даже два, одно программистское (нашел сам), второй математическое (это уже подсказали товарищи)

Вот картинка демонстрирующая:
graf.png

по X последовательность от 1 до 100

по Y шанс выпадения

белая — чистый рандом

красная — прог решение

зеленая — математическая

серая — ноль, для чистоты эталона


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

Все предложения могу добавить на график. для проверки.

Завтра к вечеру покажу что у меня есть за варианты.


upd: добавил время затраченное на просчет.
  • Вопрос задан
  • 8587 просмотров
Пригласить эксперта
Ответы на вопрос 8
@agmt
Если плотность вероятности равномерно возрастает, значит функция распределения возрастает по параболе. Значит в итоге нужное число можно получить по формуле «1+sqrt(rnd(10000))».
Ответ написан
MiXei4
@MiXei4
Генерируем число от 1 до суммы арифметической прогрессии от 1 до 100 = 5050.
Получаем x. Далее считаем при каком минимальном числе y число x окажется меньше суммы арифметической прогрессии от 1 до y.

Смысл такой — выпадает 1 — ответ 1, выпадает 2 или 3 — ответ 2, выпадает 4, 5, 6 — ответ 3 и тд
Ответ написан
Klef
@Klef Автор вопроса
т.к. ответ был дан в течении первых получаса, я в очередной раз убедился, что я плохой математик
Ответ написан
@NiGHt_LEshiY
Первое что пришло в голову — ideone.com/HO6sF0
Моих знаний математики и алгоритмов явно не хватает, но… это хотя бы примерно правильное направление мысли?
Ответ написан
@lagranzh
v = 100 * 101 / 2;
x = ceil(-1 + sqrt(1 + 8 * randi([1 v]) )) / 2;


Это на матлабе, randi([1 v]) вернет целое на отрезке [1,100].
Ответ написан
@nonbody
for($i=0; $i<1000; $i++){
$chance = 30;
if (rand(1,100)<=$chance){
echo "yeah\r\n";
}else{
echo "no chance\r\n";
}
}

Вот простейший способ оказывается
Ответ написан
@livestd
var getr=function (len){
sqr=Math.pow(len,2);
rnd=Math.random() * (sqr);
sqrt=Math.sqrt(rnd);
frnd=Math.floor(sqrt);
return frnd;
}
var arr=[0,0,0,0,0,0,0,0,0,0,0,0];
for (var i=0;i<=10000;i++){
arr[getr(12)]+=1;
if (i>=10000)
console.log(arr);
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы