将伪代码转换为Python

3 投票
3 回答
2670 浏览
提问于 2025-04-17 03:20

我先说明一下,这个问题是关于作业的,但这不是作业的内容。作业是用噪声来制作酷炫的图形。我对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 个回答

1

问题出在返回语句中的 & 7fffffff 这个部分。首先,我不太明白这个操作是什么。可能是位移操作吗?

这是一个位掩码。<< 是用来进行位移的,而 & 是位与操作。7fffffff 是一个十六进制的数字,如果把它转换成二进制的话,会有31位,全部都是1。这样做的效果是选取这个值的低31位。

为了让Python知道 7fffffff 是一个十六进制数字,你需要在前面加上 0x,所以它应该写成 0x7fffffff

其次,我不太确定在Python中怎么做这个操作。

和伪代码中的做法一样(也就是用 &)。

1

我把你代码里的 7FFFFFFF 替换成了 0x7FFFFFFF,然后试着输入了一些随机值,结果我得到的所有答案都在 [-1, 1] 这个范围内。

3

&这个符号表示的是按位与(bitwise AND)。
^这个符号表示的是按位异或(bitwise XOR)。

另外,7FFFFFFF是一个十六进制(HEX)数字。
在编程中,你可以用0x来表示一个十六进制数字,所以7FFFFFFF可以写成0x7FFFFFFF
这里有一些关于十六进制数字的进一步阅读

在Python中,想要进行按位与运算,你只需要用& 0x7FFFFFFF就可以了。
想了解更多,可以查看Python中的按位运算

撰写回答