Пример #1
0
    public static void QuickStart_Xoshiro256StarStar()
    {
        // xoshiro256** is a pseudo-random number generator.
        var xo    = new Xoshiro256StarStar(42);
        var ul    = xo.NextUInt64(); // [0, 2^64-1]
        var d     = xo.NextDouble(); // [0,1)
        var bytes = new byte[10];

        xo.NextBytes(bytes);
    }
Пример #2
0
    public void Test1()
    {
        var xo = new Xoshiro256StarStar(42);
        var rv = new RandomVault(() => xo.NextUInt64(), x => xo.NextBytes(x));

        DoubleToString(rv.NextDouble()).Is("0.0838629710598822");
        DoubleToString(rv.NextDouble()).Is("0.3789802506626686");
        DoubleToString(rv.NextDouble()).Is("0.6800434110281394");
        DoubleToString(rv.NextDouble()).Is("0.9246929453253876");
        DoubleToString(rv.NextDouble()).Is("0.9918039142821028");

        string DoubleToString(double d) => d.ToString("F16");

        rv.NextUInt64().Is(14199186830065750584ul);
        rv.NextUInt64().Is(13267978908934200754ul);
        rv.NextUInt64().Is(15679888225317814407ul);
        rv.NextUInt64().Is(14044878350692344958ul);
        rv.NextUInt64().Is(10760895422300929085ul);

        // NextULong only
        xo = new Xoshiro256StarStar(42);
        rv = new RandomVault(() => xo.NextUInt64(), null);

        DoubleToString(rv.NextDouble()).Is("0.0838629710598822");
        DoubleToString(rv.NextDouble()).Is("0.3789802506626686");
        DoubleToString(rv.NextDouble()).Is("0.6800434110281394");
        DoubleToString(rv.NextDouble()).Is("0.9246929453253876");
        DoubleToString(rv.NextDouble()).Is("0.9918039142821028");

        rv.NextUInt64().Is(14199186830065750584ul);
        rv.NextUInt64().Is(13267978908934200754ul);
        rv.NextUInt64().Is(15679888225317814407ul);
        rv.NextUInt64().Is(14044878350692344958ul);
        rv.NextUInt64().Is(10760895422300929085ul);

        // NextBytes only
        xo = new Xoshiro256StarStar(42);
        rv = new RandomVault(null, x => xo.NextBytes(x));

        DoubleToString(rv.NextDouble()).Is("0.0838629710598822");
        DoubleToString(rv.NextDouble()).Is("0.3789802506626686");
        DoubleToString(rv.NextDouble()).Is("0.6800434110281394");
        DoubleToString(rv.NextDouble()).Is("0.9246929453253876");
        DoubleToString(rv.NextDouble()).Is("0.9918039142821028");

        rv.NextUInt64().Is(14199186830065750584ul);
        rv.NextUInt64().Is(13267978908934200754ul);
        rv.NextUInt64().Is(15679888225317814407ul);
        rv.NextUInt64().Is(14044878350692344958ul);
        rv.NextUInt64().Is(10760895422300929085ul);

        // Multi-thread
        var xo2 = new Xoshiro256StarStar(42);
        var rv2 = new RandomVault(() => xo2.NextUInt64(), x => xo2.NextBytes(x));

        const int P     = 100;
        const int N     = 1000;
        var       array = new Queue <ulong> [P];
        var       t     = Parallel.For(0, P, x =>
        {
            var queue = new Queue <ulong>();
            for (var i = 0; i < N; i++)
            {
                queue.Enqueue(rv2.NextUInt64());
            }

            array[x] = queue;
        });

        var ss = new SortedSet <ulong>();

        for (var i = 0; i < P; i++)
        {
            array[i].Count.Is(N);
            while (array[i].TryDequeue(out var u))
            {
                ss.Contains(u).IsFalse();
                ss.Add(u);
            }
        }

        ss.Count.Is(P * N);
    }