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,谢谢!