2012-07-21 56 views
1

下面的伪代码如何转化为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位整数:x'参数;在“< <”和“& 7FFFFFFF”

功能是从这个网页http://freespace.virgin.net/hugo.elias/models/m_perlin.htm

+0

仅供参考,python有一个内置的随机数生成器:http://docs.python.org/library/random。html – Eugene 2012-07-21 20:19:46

+1

s/function/def /,s/IntNoise/int_noise /,s/32位整数://,在第一行末尾添加一个冒号,前置0x至7fffffff,放弃最后一个(“结束”)线。 – 2012-07-21 20:21:03

回答

2

一行行,这里的变化:

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

    我们并不需要声明的参数类型,以及不喜欢使用首字母大写,所以一行是:

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

    x = (x << 13)^x 
    

    x是左移 13位,那么结果会按位异或 -ed与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) 
+0

非常有趣。如果您不熟悉按位操作,那么伪代码确实显得相当混乱。特别是如果将'^'读作'**'。谢谢。 – Naaaysmith 2012-07-21 21:11:14

+0

分号是合法的,不会改变Python版本的含义,但它肯定不是惯用的。 – 2012-07-22 07:21:34

1

的“32位整数”部分的随机数发生器不,除非你使用numpy.int32。只要有意义,将值掩盖到32位。

“< <”代表。

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

0

从您的代码我明白了,功能IntNoise需要32-bit integer作为输入。我所知道的<<是左移运算符。并将数字的位向左移动13次。 ^是指数。 7fffffff必须是以十六进制格式表示的数字。它是8位数字,每个数字即f和7占用4位。 f是十六进制中的15的值。

1

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

+0

'os.urandom()'可能是矫枉过正的,因为OP使用非常弱的LCPRNG开始,并没有说明他为什么使用它(但downvote不是我的)。即使引用的文章也不太清楚PRNG在做什么。 – msw 2012-07-21 20:35:45

+0

-1的解释:不幸的是,这个问题与随机数无关(尽管“随机数”在链接的URL中使用不正确)。只有如何确定性地从种子中产生足够多的伪随机数。从操作系统获取熵用作种子与使用用户提供的种子相反。 – ninjagecko 2012-07-21 20:40:46