让一个数字显示一定百分比的时间
Getting a number to show up a certain percent of a time
我希望构建一个代码,使数字在 50%、35% 和 15% 的时间出现。我是 BGscript 的新手,但我并没有太多运气让它变得可靠或根本无法工作。即使您没有完成任何 BGscript 但已经用其他语言完成了。那真是太好了!
我在这里写了一篇博客 post 和用于在 BGScript 中生成随机无符号整数的示例代码:http://www.sureshjoshi.com/embedded/bgscript-random-number-generator/
本质上,它使用由模块序列号 and/or ADC LSB 噪声播种的异或移位来生成 pseudo-random 数字。
# 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)/)+ 48 + ((mac_addr(0:1)/)/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
生成器的'randomness'可以在这个散点图中看到——没有明显的趋势一目了然。
一旦你有了它,你就可以像 Rich 和 John 推荐的那样通过设置 'if' 检查来生成你的分布。请注意,此代码不提供 min/max 值来生成随机数(因为目前在 BGScript 中没有模数实现)。
Pseudo-code 可能是:
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
我希望构建一个代码,使数字在 50%、35% 和 15% 的时间出现。我是 BGscript 的新手,但我并没有太多运气让它变得可靠或根本无法工作。即使您没有完成任何 BGscript 但已经用其他语言完成了。那真是太好了!
我在这里写了一篇博客 post 和用于在 BGScript 中生成随机无符号整数的示例代码:http://www.sureshjoshi.com/embedded/bgscript-random-number-generator/
本质上,它使用由模块序列号 and/or ADC LSB 噪声播种的异或移位来生成 pseudo-random 数字。
# 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)/)+ 48 + ((mac_addr(0:1)/)/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
生成器的'randomness'可以在这个散点图中看到——没有明显的趋势一目了然。
一旦你有了它,你就可以像 Rich 和 John 推荐的那样通过设置 'if' 检查来生成你的分布。请注意,此代码不提供 min/max 值来生成随机数(因为目前在 BGScript 中没有模数实现)。
Pseudo-code 可能是:
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