Существует множество вопросов SO по взвешенному случайному, но все они полагаются на смещение, идущее на наибольшее число. Я хочу уклониться от самого низкого уровня.Выбор случайного наименьшего взвешенного
Мой алгоритм в настоящий момент является случайным образом взвешенным с уклоном в сторону более высоких значений.
double weights[2] = {1,2};
double sum = 0;
for (int i=0;i<2;i++) {
sum += weights[i];
}
double rand = urandom(sum); //unsigned random (returns [0,sum])
sum = 0;
for (int i=0;i<2;i++) {
sum += weights[i];
if (rand < sum) {
return i;
}
}
Как можно преобразовать это значение в нижнее значение смещения? Т.е. я хочу, чтобы в 100 образцах выборка веса [0] выбиралась в 66% случаев; и веса [1] 33% времени (т. е. обратное к тому, что они сейчас).
пример рук для Omni, реф сумма - вес [х] решение
Original:
1 | 1 | 1%
20 | 21 | 20%
80 | 101 | 79%
Desired:
1 | ? | 79%
20 | ? | 20%
80 | ? | 1%
Now sum - weights[i]
100(101 - 1) | 100 | 50%
81(101 - 20) | 181 | 40%
21(101 - 80) | 202 | 10%
О. :-(К сожалению, я должен был, хотя это более тщательно. – Omnifarious