1

使用Red language,我想选择一个从 1000 到 9999 的随机数。在查看了random文档后,我想random从 1000 到 9999 的系列中选择一个数字。

我知道我可以做到999 + (random 9000),但在我看来这并不好读。

4

2 回答 2

5

有一种成熟的方法可以计算两个包含边界之间的随机数:

(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

-1random以上补偿了范围从 开始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
于 2019-01-18T22:41:44.740 回答
3

您可以定义自己的功能,例如

random2: function [a b] [a - 1 + random b - a + 1]

然后random2 1000 9999

于 2019-01-18T22:40:32.400 回答