2012-05-31 3 views
0

Я смотрел на генераторы случайных чисел и нашел псевдо-код для одного:Преобразование кода в 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); 
} 

Спасибо.

+7

Почему вы не используете класс Random, который является частью .NET Framework? –

+6

плюс это не кажется очень случайным. –

+0

@ Даниэль, это ужасная реализация «RNG» – Brendan

ответ

5

Я не знаю, с какого языка вы начали, но в константах с шестнадцатеричным C# должны выглядеть по-другому: измените 7fffffff на 0x7fffffff.

3

Вы можете использовать .Net Framework случайного объект

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

Но я настоятельно рекомендую вам прочитать эту статью от Jon тарелочек о случайных генераторах

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

1

EDIT: испытан и сообщили о нуль-нулевая последовательность

  1. Преобразовать ваши шестнадцатеричные константы использовать «0x» префиксом

  2. Преобразовать Int < -> двойной тщательно

  3. Сплит выражение, чтобы сделать его немного более читаемым

Вот код и блок тест (странные результаты):

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()); 
      } 
     } 
    } 
} 
+0

Вы проверили свой код? –

+0

+0. Если вы на 100% не уверены, что в исходном языке OP '^' is Pow, ваш перевод отличается –

+0

его вывод: '1 1 1 1 1 1 1 1 1 1' –

Смежные вопросы