我想在Befunge中生成一个随机数,从0到n,其中n是任意数。我该怎么做呢? 我想过尝试这个(这个例子有2个链式代码块来展示它是如何工作的):
v v
?#>?#>
1 1
+ +
> ^> ^
并根据需要重复,但我需要n份代码。
我是否有更好的方法可以在其他语言中生成rand(0, 10)
等随机数?
答案 0 :(得分:4)
这段代码大部分都会按照您的意愿行事。 (它在0上制动。)
HashMap
请注意,在我的发电机和您的发电机中,分布并不平坦;它是binomial。 此块将生成一个从0到2 ^ n-1平滑分布的随机数:
0v \<
>?>\1-:|
1+ >$
>^
答案 1 :(得分:0)
MegaTom解决方案的较短版本,利用包装:
0v \_$
\?1+\1-:^:-1
和
0v *2\_$
\?1+\1-:^:-1
此外,这是一个非常有弹性的单线平面分布(仍然在?
垂直包裹),因为为什么不呢! :)
1+01->1# +# #?\# 1# -# :#* #2 #\_$
答案 2 :(得分:0)
书呆子!
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
的 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
,并打印出来;或(如果n <= m
)n
,并返回到整个算法的开头。对于调用者提供的任何 [0..n)
,这会在半开区间 n
中生成无偏均匀分布。
这是一个测试工具,它从半开范围 52*:*
生成和打印 [0, 10'000)
= 100 个无偏整数。 Run it on tio.run.
52*:* v
v***:::*52_@#:-1 < <
v
v >2\ v ^
>::0\0\>:|:/2<>*\v v<<<<<<< ^
^ >$1\:| :<>:2v # ^ ^
^ >$ :|:/< >>+>>v \ .
^ > #^?>\$>\:| -
^ >^ >$-:0`|
^ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $<