Given a mapping between items and their required probability of occurrence, generate a million items randomly subject to the given probabilities and compare the target probability of occurrence versus the generated values.

The total of all the probabilities should equal one. (Because floating point arithmetic is involved, this is subject to rounding errors).

aleph   1/5.0
beth    1/6.0
gimel   1/7.0
daleth  1/8.0
he      1/9.0
waw     1/10.0
zayin   1/11.0
heth    1759/27720 # adjusted so that probabilities add to 1
Related task

 Random number generator (device)


use AppleScript version "2.5" -- Mac OS X 10.11 (El Capitan) or later.
use framework "Foundation"
use framework "GameplayKit"
 
on probabilisticChoices(mapping, picks)
    script o
        property mapping : {}
    end script
 
    -- Make versions of the mapping records with additional 'actual' properties …
    set mapping to current application's class "NSMutableArray"'s arrayWithArray:(mapping)
    tell mapping to makeObjectsPerformSelector:("addEntriesFromDictionary:") withObject:({actual:0})
    -- … ensuring that they're sorted (for accuracy) in descending order (for efficiency) of probability.
    set descriptor to current application's class "NSSortDescriptor"'s sortDescriptorWithKey:("probability") ascending:(false)
    tell mapping to sortUsingDescriptors:({descriptor})
    set o's mapping to mapping as list
 
    set rndGenerator to current application's class "GKRandomDistribution"'s distributionForDieWithSideCount:(picks)
    set onePickth to 1 / picks
    repeat picks times
        -- Get a random number between 0.0 and 1.0.
        set r to rndGenerator's nextUniform()
        -- Interpret the probability of the number occurring in the range it does
        -- as picking the item with the same probability of being picked.
        repeat with thisRecord in o's mapping
            set r to r - (thisRecord's probability)
            if (r ≤ 0) then
                set thisRecord's actual to (thisRecord's actual) + onePickth
                exit repeat
            end if
        end repeat
    end repeat
 
    return o's mapping
end probabilisticChoices
 
on task()
    set mapping to {{|item|:"aleph", probability:1 / 5}, {|item|:"beth", probability:1 / 6}, ¬
        {|item|:"gimel", probability:1 / 7}, {|item|:"daleth", probability:1 / 8}, ¬
        {|item|:"he", probability:1 / 9}, {|item|:"waw", probability:1 / 10}, ¬
        {|item|:"zayin", probability:1 / 11}, {|item|:"heth", probability:1759 / 27720}}
    set picks to 1000000
    set theResults to probabilisticChoices(mapping, picks)
    set output to {}
    set template to {"|item|:", missing value, ", probability:", missing value, ", actual:", missing value}
    set astid to AppleScript's text item delimiters
    set AppleScript's text item delimiters to ""
    repeat with thisRecord in theResults
        set {|item|:item 2 of template, probability:item 4 of template, actual:item 6 of template} to thisRecord
        set {|item|:template's second item, probability:template's fourth item, actual:template's sixth item} to thisRecord
        set end of output to template as text
    end repeat
    set AppleScript's text item delimiters to "}, ¬
    {"
    set output to "{ ¬
    {" & output & "} ¬
}"
    set AppleScript's text item delimiters to astid
    return output
end task
 
task()