将伪代码转换为Python
我先说明一下,这个问题是关于作业的,但这不是作业的内容。作业是用噪声来制作酷炫的图形。我对Python有一点经验,但还不够,无法搞定这个简单的问题。
我在生成一个范围在[-1,1]之间的随机数时遇到了困难。老师给我的伪代码来自Hugo Elias。
伪代码如下:
function Noise1(integer x, integer y)
n = x + y * 57
n = (n<<13) ^ n;
return ( 1.0 - ( (n * (n * n * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);
end function
我在Python中的尝试:
def noise(x, y):
n = x + y * 57
n = (n<<5) ^ n;
return ( 1.0 - ( (n * (n * n * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0)
问题出在返回语句中的& 7fffffff
这个操作上。首先,我不太明白这个操作是什么,可能是位移操作?其次,我不知道在Python中怎么做这个操作。我刚把那部分去掉了,但得到的结果是很大的负数,完全不在[-1,1]的范围内。
3 个回答
问题出在返回语句中的 & 7fffffff 这个部分。首先,我不太明白这个操作是什么。可能是位移操作吗?
这是一个位掩码。<<
是用来进行位移的,而 &
是位与操作。7fffffff
是一个十六进制的数字,如果把它转换成二进制的话,会有31位,全部都是1。这样做的效果是选取这个值的低31位。
为了让Python知道 7fffffff
是一个十六进制数字,你需要在前面加上 0x
,所以它应该写成 0x7fffffff
。
其次,我不太确定在Python中怎么做这个操作。
和伪代码中的做法一样(也就是用 &
)。
我把你代码里的 7FFFFFFF
替换成了 0x7FFFFFFF
,然后试着输入了一些随机值,结果我得到的所有答案都在 [-1, 1] 这个范围内。
&
这个符号表示的是按位与(bitwise AND)。
而^
这个符号表示的是按位异或(bitwise XOR)。
另外,7FFFFFFF
是一个十六进制(HEX)数字。
在编程中,你可以用0x
来表示一个十六进制数字,所以7FFFFFFF
可以写成0x7FFFFFFF
。
这里有一些关于十六进制数字的进一步阅读。
在Python中,想要进行按位与运算,你只需要用& 0x7FFFFFFF
就可以了。
想了解更多,可以查看Python中的按位运算。