Получение числа, чтобы показать определенный процент времени

Я пытаюсь создать код, чтобы число отображалось в 50% случаев, в 35% случаев и в 15% случаев. Я довольно новичок в BGscript, но мне не особо повезло, что это работает надежно или вообще работает. Даже если вы еще не написали BGscript, но сделали это на другом языке. Это было бы действительно здорово!

1 ответ

Решение

Я написал пост в блоге и пример кода для генерации случайного целого без знака в BGScript здесь: http://www.sureshjoshi.com/embedded/bgscript-random-number-generator/

По сути, для генерации псевдослучайного числа используется сдвиг ксорса, засеянный серийным номером модуля и / или шумом LSB АЦП.

# Perform a xorshift (https://en.wikipedia.org/wiki/Xorshift) to generate a pseudo-random number
export procedure rand()
    t = x ^ (x << 11)
    x = y
    y = z 
    z = rand_number
    rand_number = rand_number ^ (rand_number >> 19) ^ t ^ (t >> 8)
end

и инициализируется здесь:

# Get local BT address
call system_address_get()(mac_addr(0:6))
...
tmp(15:1) = (mac_addr(0:1)/$10)+ 48 + ((mac_addr(0:1)/$10)/10*7)
tmp(16:1) = (mac_addr(0:1)&$f) + 48 + ((mac_addr(0:1)&$f )/10*7)
...
# Seed the random number generator using the last digits of the serial number 
seed = (tmp(15) << 8) + tmp(16)
call initialize_rand(seed)

# For some extra randomness, can seed the rand generator using the ADC results  
from internal temperature
    call hardware_adc_read(14, 3, 0)
end

event hardware_adc_result(input, value)
    if input = 14 then
        # Use ambient temperature check to augment seed
        seed = seed * (value & $ff)
        call initialize_rand(seed)
    end if
end

"Случайность" генератора можно увидеть на этом графике рассеяния - никаких очевидных тенденций с первого взгляда.

Получив это, вы можете сделать то же, что рекомендовали Рич и Джон, установив флажки "if" для генерации вашего дистрибутива. Обратите внимание, что этот код не предлагает значение min/max для генерации случайного числа (из-за отсутствия в настоящее время реализации по модулю в BGScript).

Псевдокод может быть:

call rand()
if rand_number <= PROBABILITY1 then
    # Show number 1
end if
if rand_number > PROBABILITY1 and rand_number <= PROBABILITY2 then
    # Show number 2
end if
if rand_number > PROBABILITY2 then
    # Show number 3
end if
Другие вопросы по тегам