Есть 3 числа: 10,20,30. Нужно выводить их со следующей вероятностью: 30 - в пять раз чаще, чем остальные 20 - в два раза чаще, и число 10, для которого вероятность не задана. Как одно число показывать, например, в 2 раза чаще, чем другое? Подскажите пожалуйста ссылки почитать.
MCNet пишу на псевдо-языке Код (Text): var A: array[1..30] of integer; i,k:integer; begin for i:=1 to 20 do A[i]:=10; for i:=21 to 30 do A[i]:=20; for i:=1 to 30 do begin k:=int(random*29)+1; xchg(A[k],A[i]); end; будет выведена последовательность из 30 чисел, где 10 будет встречаться в два раза чаще, чем 20
А может просто так: >>30 - в пять раз чаще, чем остальные >>20 - в два раза чаще, и число 10, для которого вероятность не задана. Итого имеем: 1 вероятность возникновения 10, 2*1 -возникновение 20, 5*( 2+1 ) = 15 - возникновение 30. Итого: 15+2+1 = 18 интервалов. Тогда, если писать на "псевдо"-Pascal, то так: r := integer(random*18); if (r < 15) then a := 30 { 15/18 всего интервала } else if (r < 17) then a := 20 { 2/18 интервала } else a := 10; { 1/18 интервала } P.S. Вместо random лучше, конечно, использовать генератор получше. С каким-нибудь подходящим для случая нормальным законом распределения.
Mikl__ Ну я так и предлагаю! Разбиваю отрезок [0.0 .. 1.0] пропорционально частоте возникновения, масштабирую до целых и получаю [0..18], где 30 занимает в 5 раз больше места, чем 20 и 10 вместе взятые, ну а 20 в 2 раза больше, чем 10. Я так понимаю именно это и нужно.
Magnum Я так и написал Код (Text): {генерирую последовательность из M чисел 10 и 20} for i:=1 to N do A[i]:=10;{вероятность появления числа 10 =N/M} for i:=N+1 to M do A[i]:=20;{вероятность появления числа 20 =(M-N)/M} {привожу последовательность к случайному виду} for i:=1 to M do begin tmp:=A[i]; k:=int(random*(M-1))+1; A[i]:=A[k]; A[k]:=tmp; end;
Magnum Разве это проще? Я предложил вариант вообще без кучи циклов с заполнением. Сразу получаю нужное значение и далее им пользуюсь по необходимости.