使用Red language,我想选择一个从 1000 到 9999 的随机数。在查看了random文档后,我想random
从 1000 到 9999 的系列中选择一个数字。
我知道我可以做到999 + (random 9000)
,但在我看来这并不好读。
使用Red language,我想选择一个从 1000 到 9999 的随机数。在查看了random文档后,我想random
从 1000 到 9999 的系列中选择一个数字。
我知道我可以做到999 + (random 9000)
,但在我看来这并不好读。
有一种成熟的方法可以计算两个包含边界之间的随机数:
(random(0,1) * (max - min + 1)) + min
将其移植到 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
-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
您可以定义自己的功能,例如
random2: function [a b] [a - 1 + random b - a + 1]
然后random2 1000 9999