Haskell中的整数到噪声函数

Haskell中的整数到噪声函数,haskell,noise,perlin-noise,Haskell,Noise,Perlin Noise,我正在尝试实现一个基本的柏林噪声函数(我知道有一个库可以做到这一点,我只想尝试我自己的),我对用于从整数输入生成确定性噪声的整数到噪声函数有一些问题 我正在尝试实现的功能定义如下: 到目前为止,我的代码如下所示: noise2d :: (Int32, Int32) -> Double noise2d (x, y) = let m = x + y * 57 n = (shiftR m 13) ^ m j = (n * (n * n * 15731 +

我正在尝试实现一个基本的柏林噪声函数(我知道有一个库可以做到这一点,我只想尝试我自己的),我对用于从整数输入生成确定性噪声的整数到噪声函数有一些问题

我正在尝试实现的功能定义如下:

到目前为止,我的代码如下所示:

noise2d :: (Int32, Int32) -> Double
noise2d (x, y) =
    let m = x + y * 57
        n = (shiftR m 13) ^ m
        j = (n * (n * n * 15731 + 789221) + 1376312589) .&. 0x7fffffff
    in  1.0 - (fromIntegral j / 1073741824.0)
代码可以编译,但对于任何输入,我都会得到相同的结果,因为n的值为0

有更好的方法吗?

您的错误是

n = (shiftR m 13) `xor` m
                  ^^^^^
(而不是电源功能
(^)

您的错误是

n = (shiftR m 13) `xor` m
                  ^^^^^

(不是电源功能
(^)

问题源于使用
^
-运算符。在C语言中,它是位排他析取(xor),而在Haskell语言中,它是指数运算。所以,你只需要把第四行改成

        n = (shiftR m 13) `xor` m

一切都应该很好。

问题源于您使用了
^
-运算符。在C语言中,它是位排他析取(xor),而在Haskell语言中,它是指数运算。所以,你只需要把第四行改成

        n = (shiftR m 13) `xor` m

一切都会好起来。

是的,就是这样!看起来我需要刷一下我的C,谢谢!是的,就是这样!看起来我需要刷一下我的C,谢谢!