问题描述
我正在尝试使用 random/3
random(+L:int,+U:int,-R:int)
有什么东西可以用来表示无穷大吗?
例如:
random(0,Infinity,Random_Number).
是否可以通过随机实现这一点?或者还有其他简单的选择吗?
P.S. 我在使用 sup ( Supremum ) 的地方制作了 clpfd 程序,但我没有使用 clpfd。
解决方法
评论中的讨论很有趣。我对无穷数和数学的不发达直觉告诉我:
可以在物理计算机上使用一致表示法表示的整数数量是有限的。因此,将有无数其他整数无法表示。所以,如果你随机选择任何数字,你可以在你的机器上表示它的概率是 0。你不妨定义:
random_between(0,infinite,infinite).
Transfinite numbers 可能是一个开始阅读的地方,但我该说谁呢。你需要一个数学家来解决这类问题,而不是一个编程行人。
也许你应该在https://math.stackexchange.com/问?
对于您的问题:您可以用符号表示无穷大的概念,例如原子 infinite
。然后,您需要决定如何在代数中处理该概念,并为其提供规则。上面的 random_between/3
只是一个例子。如需灵感,请查看 how floating point numbers handle infinity。
我认为评论中的讨论不太有用。大卫是对的,没有办法得到一个没有上限的统一整数,但不清楚这是否是你想要的。绝对有方法可以从 skewed 分布中获得无界随机整数,其中接近 0 的数字比远离 0 的数字更有可能,但 没有 整数,甚至不是一个有 10000 万亿位的数字,是不可能的。 (只要不超过 Prolog 的内存即可。)
这是一个简单的生成器。一、随机长度列表:
random_length(List) :-
random(P),( P > 0.25
-> List = [_ | Tail],random_length(Tail)
; List = [] ).
示例:
?- random_length(List).
List = [].
?- random_length(List).
List = [_2004,_2022,_2040,_2058,_2076].
?- random_length(List).
List = [].
?- random_length(List).
List = [_2004,_2058].
接下来,随机位的随机长度列表:
random_bit(Bit) :-
random(P),( P > 0.5
-> Bit = 1
; Bit = 0 ).
random_bits(Bits) :-
random_length(Bits),maplist(random_bit,Bits).
示例:
?- random_bits(Bits).
Bits = [0].
?- random_bits(Bits).
Bits = [1,1,0].
?- random_bits(Bits).
Bits = [].
?- random_bits(Bits).
Bits = [0,0].
然后我们可以将这个位列表评估为一个数字,假设使用这种方法:
bits_value([],0).
bits_value([Bit | Bits],Value) :-
bits_value(Bits,TailValue),Value is TailValue * 2 + Bit.
示例:
?- random_bits(Bits),bits_value(Bits,Value).
Bits = [1,0],Value = 3.
?- random_bits(Bits),Value).
Bits = [0,Value = 2.
?- random_bits(Bits),Value = 24.
?- random_bits(Bits),1],Value).
Bits = [],Value = 0.
这些列表的长度没有限制,但它们往往很短,因此值相当低。我们可以修改 random_length
中的 0.25 因子,使更长的列表更有可能。例如,使用 0.01:
?- random_bits(Bits),Value = 64.
?- random_bits(Bits),0|...],Value = 137345267061686159418.
?- random_bits(Bits),Value = 105607189397659.
?- random_bits(Bits),Value = 104.
这里有很多可以修改的东西,例如,只包含零的列表不是很有用。您可以向此类列表添加“隐式 1”元素。您还可以将其中一位视为符号位以允许生成负数。您可以通过生成两个随机整数 P
和 Q
并使用 P/Q
作为随机值来生成随机的、完全无界的有理数。等等。