【问题标题】:Pseudocode interpretation伪代码解释
【发布时间】:2012-07-20 16:26:51
【问题描述】:

以下伪代码将如何转换为 Python?

function IntNoise(32-bit integer: x)             

    x = (x<<13) ^ x;
    return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);    

end IntNoise function  

我不确定以下项目:IntNoise 调用中的 32-bit integer: x 参数; &lt;&lt;&amp;7fffffff

该函数是来自此网页的随机数生成器:Perlin Noise

【问题讨论】:

  • 仅供参考,python 有一个内置的随机数生成器:docs.python.org/library/random.html
  • s/function/def/, s/IntNoise/int_noise/, s/32-bit integer: //,在第一行末尾加一个冒号,在 7fffffff 前面加上 0x,去掉最后(“结束”)行。

标签: python pseudocode


【解决方案1】:

一行一行,变化如下:

  1. function IntNoise(32-bit integer: x)

    我们不需要声明参数类型,也不想使用 CamelCase,所以第一行是:

    def intnoise(x):
    
  2. 下一行唯一的错误是分号。删除它,我们得到:

    x = (x << 13) ^ x
    

    x 将向左移动 13 位,然后将结果与 x 的起始值按位 异或

  3. 在下一行,再次没有分号,7ffffff 需要以0x 为前缀,因此:

    return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0)
    

总而言之,这使得:

def intnoise(x):
    x = (x << 13) ^ x
    return (1.0 - ((x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0)

【讨论】:

  • 非常有趣。如果您不熟悉按位运算,那么伪代码确实显得相当混乱。特别是如果将'^'读作'**'。谢谢。
  • 分号是合法的,不会改变 Python 版本的含义,但它当然也不是惯用的。
【解决方案2】:

“32 位整数”部分没有,除非您使用 numpy.int32。在有意义的情况下,只需将值屏蔽为 32 位即可。

“& 7fffffff”需要转换。 “&”代表,但十六进制文字需要一点:0x7fffffff

【讨论】:

    【解决方案3】:

    作为一个学习练习 - 很好,但是一旦你理解了它,只需使用 os.urandom(4) 来生成随机数,或者使用 random 中的函数来生成各种伪随机生成器。

    【讨论】:

    • os.urandom() 可能是矫枉过正,因为 OP 使用的是一个非常弱的 LCPRNG 开始并且没有说明他为什么使用它(但反对票不是我的)。即使是引用的文章也不太清楚 PRNG 在做什么。
    • -1 的解释:不幸的是,这个问题与随机数无关(尽管“随机数”在链接的 URL 中使用不正确)。仅如何从种子中确定性地产生足够伪随机数。从操作系统获取熵以用作种子与使用用户提供的种子相反。
    【解决方案4】:

    根据您的代码,我确实理解的是,函数IntNoise32-bit integer 作为输入。据我所知,&lt;&lt; 是左移运算符。并将数字的位向左移动 13 次。 ^ 是指数级的。并且7fffffff 必须是十六进制表示形式的数字。它是 8 位数字,每个数字,即 f 和 7 占用 4 位。 f15 的十六进制值。

    【讨论】:

      猜你喜欢
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      • 2016-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多