Вывод чисел с некоторым шансом (вероятностью)

Тема в разделе "WASM.BEGINNERS", создана пользователем MCNet, 14 янв 2008.

  1. MCNet

    MCNet New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2006
    Сообщения:
    74
    Есть 3 числа: 10,20,30.

    Нужно выводить их со следующей вероятностью:
    30 - в пять раз чаще, чем остальные
    20 - в два раза чаще, и число 10, для которого вероятность не задана.

    Как одно число показывать, например, в 2 раза чаще, чем другое?

    Подскажите пожалуйста ссылки почитать.
     
  2. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    MCNet
    пишу на псевдо-языке:)
    Код (Text):
    1. var
    2. A: array[1..30] of integer;
    3. i,k:integer;
    4. begin
    5. for i:=1 to 20 do A[i]:=10;
    6. for i:=21 to 30 do A[i]:=20;
    7. for i:=1 to 30 do
    8. begin
    9. k:=int(random*29)+1;
    10. xchg(A[k],A[i]);
    11. end;
    будет выведена последовательность из 30 чисел, где 10 будет встречаться в два раза чаще, чем 20
     
  3. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    А может просто так:
    >>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 лучше, конечно, использовать генератор получше. С каким-нибудь подходящим для случая нормальным законом распределения.
     
  4. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Xerx
    [deleted]
     
  5. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Mikl__
    Ну я так и предлагаю! Разбиваю отрезок [0.0 .. 1.0] пропорционально частоте возникновения, масштабирую до целых и получаю [0..18], где 30 занимает в 5 раз больше места, чем 20 и 10 вместе взятые, ну а 20 в 2 раза больше, чем 10. Я так понимаю именно это и нужно.
     
  6. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    Mikl__
    инициатива наказуема )
    приобретите модуль для распознавания флудо-спамеров ;)
     
  7. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Может проще сперва сгенерировать, а после пропарсить весь ряд и привести к нужной вероятности??
     
  8. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Magnum
    Я так и написал
    Код (Text):
    1. {генерирую последовательность из M чисел 10 и 20}
    2. for i:=1 to N do A[i]:=10;{вероятность появления числа 10 =N/M}
    3. for i:=N+1 to M do A[i]:=20;{вероятность появления числа 20 =(M-N)/M}
    4. {привожу последовательность к случайному виду}
    5. for i:=1 to M do
    6. begin
    7. tmp:=A[i]; k:=int(random*(M-1))+1; A[i]:=A[k]; A[k]:=tmp;
    8. end;
     
  9. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Magnum
    Разве это проще? Я предложил вариант вообще без кучи циклов с заполнением. Сразу получаю нужное значение и далее им пользуюсь по необходимости.
     
  10. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Главное, чтобы генератор был с равномерным распределением и всё тут.
     
  11. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    asmfan
    Я это и написал.
    Просто еще и алгоритм для получения чисел с нужной вероятностью привел.
     
  12. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Нормальное оно же гауссовское (если память не изменяет) не равно равномерному.