3

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

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

并根据需要重复,但我需要 n 个该代码块的副本。rand(0, 10)有没有更好的方法可以像其他语言一样生成随机数?

4

3 回答 3

4

这个片段将主要做你想做的事。(它在 0 时刹车。)

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

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

0v  *2\<
>?>\1-:|
 1+    >$
 >^ 
于 2015-07-01T18:51:11.790 回答
0

书呆子!

这是我的解决方案

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

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

  • 在第一阶段,我们用 初始化堆栈n n 0 0 n并将其转换n2 2 ... 2 2.
  • 在第二阶段,我们将所有这些 2 相乘以产生n n 0 0 2^kfor k >= lg n
  • 在第三阶段,我们转换2^km= 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`|
^ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $<
于 2020-12-22T21:55:35.420 回答
0

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

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

在线试用!

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

在线试用!

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

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

在线试用!

于 2016-11-04T21:00:42.363 回答