0

私は乱数ジェネレーターを調べていて、その疑似コードを見つけました:

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);
}

ありがとう。

4

3 に答える 3

5

どの言語から始めたのかわかりませんが、C# では 16 進定数の見た目が異なるはずです: に変更7fffffff0x7fffffffます。

于 2012-05-31T17:01:22.857 に答える
3

You can use the .Net Framework random object

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

But I strongly recommend you to read this article from Jon Skeet about random generators

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

于 2012-05-31T17:03:41.053 に答える
1

EDIT: tested and reported a non-null sequence

  1. Convert your hexadecimal constants to use "0x" prefix

  2. Convert int <-> double carefully

  3. Split the expression to make it a little bit more readable

コードと単体テストは次のとおりです(奇妙な結果ですが):

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());
           }
        }
    }
}
于 2012-05-31T17:03:49.743 に答える