我想在 Befunge 中生成一个随机数,从 0 到 n,其中 n 是任意数。我该怎么做呢?
我想试试这个(这个例子有 2 个链接的代码块来展示它是如何工作的):
v v
?#>?#>
1 1
+ +
> ^> ^
并根据需要重复,但我需要 n 个该代码块的副本。rand(0, 10)
有没有更好的方法可以像其他语言一样生成随机数?
这个片段将主要做你想做的事。(它在 0 时刹车。)
0v \<
>?>\1-:|
1+ >$
>^
请注意,在我的生成器和您的生成器中,分布并不平坦。它是二项式的。此块将生成一个从 0 到 2^n-1 平滑分布的随机数:
0v *2\<
>?>\1-:|
1+ >$
>^
书呆子!
v
v >2\ v
>>>::0\0\>:|:/2<>*\v v<<<<<<<
^ >$1\:| :<>:2v # ^ @
^ >$ :|:/< >>+>>v \ .
> #^?>\$>\:| -
>^ >$-:0`|
^ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $<
在左侧输入,n
在堆栈上。每一个都|
标志着算法的一个新阶段。
n n 0 0 n
并将其转换n
为2 2 ... 2 2
.n n 0 0 2^k
for k >= lg n
。2^k
为m
= 2^k + 2^{k-1} + 2^{k-2} + ... + 4 + 2 + 1
,只是我们使用?
以 50% 的概率跳过每个术语。n n m
为 (if n > m
)m
并打印它;或 (if n <= m
) n
,然后返回整个算法的开头。对于调用者提供的[0..n)
任何内容,这都会在半开范围内生成无偏的均匀分布。n
52*:*
这是一个测试工具,它从半开范围生成并打印= 100 个无偏整数[0, 10'000)
。在 tio.run 上运行它。
52*:* v
v***:::*52_@#:-1 < <
v
v >2\ v ^
>::0\0\>:|:/2<>*\v v<<<<<<< ^
^ >$1\:| :<>:2v # ^ ^
^ >$ :|:/< >>+>>v \ .
^ > #^?>\$>\:| -
^ >^ >$-:0`|
^ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $<