在Befunge中生成一个随机数

时间:2015-06-27 03:13:00

标签: random befunge

我想在Befunge中生成一个随机数,从0到n,其中n是任意数。我该怎么做呢? 我想过尝试这个(这个例子有2个链式代码块来展示它是如何工作的):

v  v
?#>?#>
1  1
+  +
> ^> ^

并根据需要重复,但我需要n份代码。 我是否有更好的方法可以在其他语言中生成rand(0, 10)等随机数?

3 个答案:

答案 0 :(得分:4)

这段代码大部分都会按照您的意愿行事。 (它在0上制动。)

HashMap

请注意,在我的发电机和您的发电机中,分布并不平坦;它是binomial块将生成一个从0到2 ^ n-1平滑分布的随机数:

0v    \<
>?>\1-:|
 1+    >$
 >^

答案 1 :(得分:0)

MegaTom解决方案的较短版本,利用包装:

0v     \_$
\?1+\1-:^:-1

TryItOnline!

0v   *2\_$
\?1+\1-:^:-1

TryItOnline!

此外,这是一个非常有弹性的单线平面分布(仍然在?垂直包裹),因为为什么不呢! :)

1+01->1# +# #?\# 1# -# :#* #2 #\_$

TryItOnline!

答案 2 :(得分:0)

书呆子!

Here's my solution

  v
  v        >2\ v                        
>>>::0\0\>:|:/2<>*\v      v<<<<<<<         
  ^        >$1\:| :<>:2v  #      ^     @  
  ^             >$ :|:/< >>+>>v  \     .  
                    >   #^?>\$>\:|     -  
                          >^     >$-:0`|
  ^ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $<

在左边输入,n 在堆栈上。每个 | 都标志着算法的一个新阶段。

  • 在第一阶段,我们使用 n n 0 0 n 初始化堆栈并将 n 转换为 2 2 ... 2 2
  • 在第二阶段,我们将所有这些 2 相乘得到 n n 0 0 2^kk >= 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 <= mn,并返回到整个算法的开头。

对于调用者提供的任何 [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`|
^ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $<