获取一个数字以显示某个百分比的时间

时间:2015-03-26 19:46:22

标签: random functional-programming bluegiga

我希望构建一个代码,让数字显示50%的时间,35%的时间和15%的时间。我对BGscript很陌生,但我没有太多的运气使这个可靠或工作。即使你没有完成任何BGscript,但用其他语言做过。那真是太棒了!

1 个答案:

答案 0 :(得分:0)

我写了一篇博文和示例代码,用于在BGScript中生成随机unsigned int:http://www.sureshjoshi.com/embedded/bgscript-random-number-generator/

基本上,它使用由模块的序列号和/或ADC LSB噪声播种的xorshift来生成伪随机数。

# 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

可以在此散点图中查看生成器的“随机性” - 一目了然没有明显的趋势。

enter image description here

完成后,您可以通过设置“if”检查来生成您的发布,与Rich和John建议的内容类似。请注意,此代码不提供最小值/最大值来生成随机值(由于当前没有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