Best Random Number Generator using C#

using System;
using System.Collections.Generic;
using System.Text;

namespace RandomNumberGeneration
{
///
///
/// Based on subtractive generalized Fibonacci sequence
///
/// see: http://www.shadlen.org/ichbin/random/generators.htm#knuth
///
public sealed class Knuth : RandomBase
{
#region Constructors

public Knuth() : this(Convert.ToInt32(DateTime.Now.Ticks & 0x000000007FFFFFFF)) { }

public Knuth(int seed)
: base(seed)
{
#region Declarations

int i, j, v, w;

#endregion

#region Initialization

m_x = new int[N];
v = seed;
w = 1;

#endregion

#region Execution

for (i = 0; i <>
{
j = (21 * i) % N; // randomize order a bit

m_x[j] = w;

w = v - w;

if (w <>
w = w + (m - 1);

v = m_x[j];
}

// set the pointers
m_p = N - 1;
m_q = N - M - 1;

// prime the pump
for (i = 0; i <>
{
v = Next();
}

#endregion

}

#endregion

#region Member Variables

private static readonly int N = 55;
private static readonly int M = 24;
private static readonly int m = 2147483647; // 2^31 - 1
private static readonly double mi = 1.0 / m;

private int[] m_x;
private int m_p, m_q;

#endregion

#region Methods

public override int Next()
{
#region Declarations

int y;

#endregion

#region Execution

if (m_p == N - 1)
{
m_p = 0;
}
else
{
(m_p)++;
}

if (m_q == N - 1)
{
m_q = 0;
}
else
{
(m_q)++;
}

y = m_x[m_p] - m_x[m_q];

if (y <>
{
y = y + (m - 1);
}

m_x[m_p] = y;

return y;

#endregion

}

#endregion

}
}

Comments

Popular Posts