使用Red语言,我想从1000到9999中选择一个随机数。查看了随机文档后,我想random从1000到9999之间的一个序列中选择一个数字。
我知道我可以做到,999 + (random 9000)但是我认为这并不好。
有一种成熟的方法可以计算两个包含边界之间的随机数:
(random(0,1) * (max - min + 1)) + min
Run Code Online (Sandbox Code Playgroud)
将其移植到Red应该很简单,并且将其包装到专用功能中将减轻“可读性”问题。例如:
>> between: func [lower upper][-1 + lower + random upper - lower + 1]
== func [lower upper][-1 + lower + random upper - lower + 1]
>> round average collect [loop 1'000'000 [keep between -10 10]]
== 0.0
Run Code Online (Sandbox Code Playgroud)
-1以上补偿random范围始于1而非事实0。
Poka-Yoke 通过从两个给定的边界中选取最小值/最大值between来确保下限确实低于上限。我将其作为练习留给读者。
从字面上选择一系列随机数的另一种方法是:
>> thru: make op! func [lower upper][collect [until [keep lower greater? lower: lower + 1 upper]]]
== make op! [[lower upper]]
>> -10 thru 10
== [-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10]
>> random/only -10 thru 10
== 5
Run Code Online (Sandbox Code Playgroud)