将代码转换为C#

时间:2012-05-31 16:55:14

标签: c#

我正在查看随机数生成器并找到一个伪代码:

function Noise1(integer x)
    x = (x<<13) ^ x;
    return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);    
end function

我想把它转换成C#,但我得到各种错误,如无效表达式和“)”预期。这是我到目前为止如何转换它?

double Noise(int x) {
    x = (x<<13) ^ x;
    return ( 1.0 - ((x * (x * x * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);
}

感谢。

3 个答案:

答案 0 :(得分:5)

我不知道你开始使用的语言,但在C#中,常量应该看起来不同:将7fffffff更改为0x7fffffff

答案 1 :(得分:3)

您可以使用.Net Framework随机对象

Random rng = new Random();
return rng.Next(10)

但我强烈建议您阅读Jon Skeet关于随机生成器的文章

http://csharpindepth.com/Articles/Chapter12/Random.aspx

答案 2 :(得分:1)

编辑:测试并报告非空序列

  1. 将十六进制常量转换为使用“0x”前缀

  2. 转换int&lt; - &gt;仔细加倍

  3. 拆分表达式以使其更具可读性

  4. 这是代码和单元测试(虽然结果很奇怪):

    using System;
    
    namespace Test
    {
        public class Test
        {
            public static Int64 Noise(Int64 x) {
                 Int64 y = (Int64) ( (x << 13) ^ x);
    
                 Console.WriteLine(y.ToString());
    
                 Int64 t = (y * (y * y * 15731 + 789221) + 1376312589);
    
                 Console.WriteLine(t.ToString());
    
                 Int64 c = t < 0 ? -t : t; //( ((Int32)t) & 0x7fffffff);
    
                 Console.WriteLine("c = " + c.ToString());
    
                 double b = ((double)c) / 1073741824.0;
    
                 Console.WriteLine("b = " + b.ToString());
    
                 double t2 = ( 1.0 - b);
                 return (Int64)t2;
            }
    
            static void Main()
            {
    
               Int64 Seed = 1234;
    
               for(int i = 0 ; i < 3 ; i++)
               {
                   Seed = Noise(Seed);
                   Console.WriteLine(Seed.ToString());
               }
            }
        }
    }