Beispiel #1
0
    public void FloatBits_TEST()
    {
        Xorshift random = new Xorshift(Seed);

        for (int i = 0; i < 100000; ++i)
        {
            double value = random.Uniform(-1.0e+9, 1.0e+9);
            var    enc   = new Float64Bits(value);

            var ms = new MemoryStream();
            enc.Write(ms);

            var dec = new Float64Bits(ms.ToArray(), 0);

            // perfect equal
            Assert.AreEqual(dec.Value, value);
        }

        for (int i = 0; i < 100000; ++i)
        {
            float value = (float)random.Uniform(-1.0e+6, 1.0e+6);

            var enc = new Float32Bits(value);

            var ms = new MemoryStream();
            enc.Write(ms);

            var dec = new Float32Bits(ms.ToArray(), 0);

            // perfect equal
            Assert.AreEqual(dec.Value, value);
        }
    }
Beispiel #2
0
    public void Plist_Binary_TEST()
    {
        Xorshift random = new Xorshift(Seed);

        // Trailer
        for (int i = 0; i < 100000; ++i)
        {
            var trailer = new Plist.Trailer();
            trailer.ShortVersion      = (byte)(random.Generate() & 0xFF);
            trailer.OffsetIntSize     = (byte)(random.Generate() & 0xFF);
            trailer.ObjectRefSize     = (byte)(random.Generate() & 0xFF);
            trailer.NumObjects        = (ulong)random.Generate() | ((ulong)random.Generate() << 32);
            trailer.TopObject         = (ulong)random.Generate() | ((ulong)random.Generate() << 32);
            trailer.OffsetTableOffset = (ulong)random.Generate() | ((ulong)random.Generate() << 32);

            var ms = new MemoryStream();
            Plist.WriteTrailerBinary(ms, trailer);
            var read = Plist.ReadTrailerBinary(ms.ToArray());
            Assert.AreEqual(trailer.GetHashCode(), read.GetHashCode());
            Assert.AreEqual(trailer, read);
        }

        for (int i = 0; i < 5000; ++i)
        {
            object value1 = Arbitrary.Plist();
            var    data   = Plist.WriteObjectBinary(value1);
            object value2 = Plist.ReadObjectBinary(data);
            Assert.IsTrue(Plist.EqualObject(value1, value2, 1.0e-9, 1.0e-3), string.Format("serialize error [{0}]", i));
        }
    }
Beispiel #3
0
    public void Plist_XML_TEST()
    {
        Xorshift random = new Xorshift(Seed);

        for (int i = 0; i < 1000; ++i)
        {
            object value1 = Arbitrary.Plist();
            var    data   = Plist.WriteObjectXML(value1);
            object value2 = Plist.ReadObjectXML(data);
            Assert.IsTrue(Plist.EqualObject(value1, value2, 1.0e-9, 1.5), string.Format("serialize error [{0}]", i));
        }
    }
Beispiel #4
0
        public T Operator(Xorshift xorshift)
        {
            if (xorshift == null)
            {
                throw new ArgumentNullException(nameof(xorshift));
            }

            xorshift.ThrowIfDisposed();
            this.ThrowIfDisposed();

            return(this._Implement.Operator(this.NativePtr, xorshift.NativePtr));
        }
Beispiel #5
0
        /// <summary>
        /// パーリンノイズ用のグリッドを生成する
        /// </summary>
        /// <returns></returns>
        static public int[] CreateGrid(int seed)
        {
            Xorshift xorshift = new Xorshift((uint)seed);

            int[] p = new int[256];
            for (int i = 0; i < p.Length; i++)
            {
                p[i] = (int)Mathf.Floor(xorshift.Random() * 256);
            }

            int[] p2 = new int[512];
            for (int i = 0; i < p2.Length; i++)
            {
                p2[i] = p[i & 255];
            }

            return(p2);
        }
Beispiel #6
0
    public PerlinNoise(uint seed)
    {
        _xorshift = new Xorshift(seed);

        int[] p = new int[256];
        for (int i = 0; i < p.Length; i++)
        {
            p[i] = (int)Mathf.Floor(_xorshift.Random() * 256);
        }

        int[] p2 = new int[512];
        for (int i = 0; i < p2.Length; i++)
        {
            p2[i] = p[i & 255];
        }

        _p = p2;
    }
Beispiel #7
0
    public void BigEndianIO_TEST()
    {
        for (int i = 0; i <= ushort.MaxValue; ++i)
        {
            ushort value = (ushort)i;
            var    ms    = new MemoryStream();
            BigEndianWriter.WriteUShort(ms, value);
            ushort read1 = BigEndianReader.ReadUShort(ms.ToArray(), 0);
            Assert.AreEqual(read1, value);

            ulong read2 = BigEndianReader.ReadNBytesUnsignedInteger(ms.ToArray(), 2, 0);
            Assert.IsTrue(read2 <= ushort.MaxValue);
            Assert.AreEqual((ushort)read2, value);
        }

        Xorshift random = new Xorshift(Seed);

        for (int i = 0; i < 100000; ++i)
        {
            uint value = random.Generate();
            var  ms    = new MemoryStream();
            BigEndianWriter.WriteUInt(ms, value);
            uint read1 = BigEndianReader.ReadUInt(ms.ToArray(), 0);
            Assert.AreEqual(read1, value);

            ulong read2 = BigEndianReader.ReadNBytesUnsignedInteger(ms.ToArray(), 4, 0);
            Assert.IsTrue(read2 <= uint.MaxValue);
            Assert.AreEqual((uint)read2, value);
        }

        for (int i = 0; i < 100000; ++i)
        {
            ulong value = (ulong)random.Generate() | ((ulong)random.Generate() << 32);
            var   ms    = new MemoryStream();
            BigEndianWriter.WriteULong(ms, value);
            ulong read1 = BigEndianReader.ReadULong(ms.ToArray(), 0);
            Assert.AreEqual(read1, value);

            ulong read2 = BigEndianReader.ReadNBytesUnsignedInteger(ms.ToArray(), 8, 0);
            Assert.AreEqual(read2, value);
        }
    }
    /// <summary>
    /// Constructor
    /// </summary>
    public PerlinNoise(uint seed)
    {
        _xorshit = new Xorshift(seed);

        int[] p = new int[256];
        for (int i = 0; i < p.Length; i++)
        {
            // 0 - 255の間のランダムな値を生成する
            p[i] = (int)Mathf.Floor(_xorshit.Random() * 256);
        }

        // pの倍の数の配列を生成する
        int[] p2 = new int[p.Length * 2];
        for (int i = 0; i < p2.Length; i++)
        {
            p2[i] = p[i & 255];
        }

        _p = p2;
    }
            public Vector2[] GetPointsFromGameCollider()
            {
                if (collider2D == null)
                {
                    return(null);
                }
                if (collider2D is PolygonCollider2D)
                {
                    return(((PolygonCollider2D)collider2D).points);
                }
                if (collider2D is BoxCollider2D)
                {
                    var       boxCollider2D = (BoxCollider2D)collider2D;
                    Vector2[] ret           = new Vector2[4];
                    Vector2   leftBottom    = boxCollider2D.offset - boxCollider2D.size / 2;;
                    Vector2   rightTop      = boxCollider2D.offset + boxCollider2D.size / 2;
                    ret[0] = leftBottom;
                    ret[1] = new Vector2(leftBottom.x, rightTop.y);
                    ret[2] = rightTop;
                    ret[3] = new Vector2(rightTop.x, leftBottom.y);
                    return(ret);
                }
                Xorshift xorShift = new Xorshift(1234);

                if (collider2D is CircleCollider2D)
                {
                    var       circleCollider2D = (CircleCollider2D)collider2D;
                    int       split            = 30;
                    Vector2[] ret = new Vector2[split];
                    for (int i = 0; i < split; i++)
                    {
                        float angle  = -Mathf.PI * 2 * i / split;
                        float radius = circleCollider2D.radius;

                        ret[i] = (new Vector2(Mathf.Cos(angle), Mathf.Sin(angle))) * (radius * (xorShift.Range(995, 1005) / 1000.0f)) + circleCollider2D.offset;
                    }
                    return(ret);
                }
                return(null);
            }
        public void DenseGraphCheck()
        {
            const uint N = 500;

            using var a   = new Dense <double>(N);
            using var r   = new Xorshift(1234);
            using var urd = new StdUniformRealDistribution <double>(-10, 10);
            for (uint i = 0; i < N; i++)
            {
                for (uint j = i; j < N; j++)
                {
                    a.J[i, j] = urd.Operator(r);
                }
            }

            using var r2 = new Xorshift(1234);

            // check if graph holds correct variables
            for (uint i = 0; i < N; i++)
            {
                for (uint j = i; j < N; j++)
                {
                    Assert.Equal(a.J[i, j], urd.Operator(r2));
                }
            }

            using var r3 = new Xorshift(1234);

            // check if graph index is reversible (Jij = Jji)
            for (uint i = 0; i < N; i++)
            {
                for (uint j = i; j < N; j++)
                {
                    Assert.Equal(a.J[j, i], urd.Operator(r3));
                }
            }
        }
Beispiel #11
0
        /// <summary>
        /// 初期化処理
        /// </summary>
        private void Initialize()
        {
            int seed = Mathf.Clamp(_seed, 0, 2 << 30 - 1);

            _xorshift = new Xorshift((uint)seed);
            _p        = CreateGrid();

            _particleNumPerMesh = MAX_VERTEX_NUM / _mesh.vertexCount;
            _meshNum            = (int)Mathf.Ceil((float)_maxParticleNum / _particleNumPerMesh);

            for (int i = 0; i < _meshNum; i++)
            {
                Material material = new Material(_shader);
                material.SetInt("_IdOffset", _particleNumPerMesh * i);
                _materials.Add(material);
            }

            _combinedMesh = CreateCombinedMesh(_mesh, _particleNumPerMesh);

            _particles = new ComputeBuffer(_maxParticleNum, Marshal.SizeOf(typeof(Particle)));

            Particle[] particles = GenerateParticles();
            _particles.SetData(particles);

            _renderTexture = new RenderTexture(256, 256, 0);
            _renderTexture.enableRandomWrite = true;
            _renderTexture.useMipMap         = false;
            _renderTexture.Create();

            Renderer ren = _quad.GetComponent <Renderer>();

            _material             = ren.material;
            _material.mainTexture = _renderTexture;

            _kernelIndex  = _computeShader.FindKernel("CurlNoiseMain");
            _kernelIndex2 = _computeShader.FindKernel("OutputResult");
        }
Beispiel #12
0
 public void StaticSamplesConsistent()
 {
     Assert.That(Xorshift.Doubles(1000, 1), Is.EqualTo(new Xorshift(1).NextDoubles(1000)).Within(1e-12).AsCollection);
 }
        public void SparseGraphCheck()
        {
            const uint N = 500;

            using var b   = new Sparse <double>(N, N - 1);
            using var r   = new Xorshift(1234);
            using var urd = new StdUniformRealDistribution <double>(-10, 10);
            for (uint i = 0; i < N; i++)
            {
                for (uint j = i + 1; j < N; j++)
                {
                    b.J[i, j] = urd.Operator(r);
                }
            }

            using var r2 = new Xorshift(1234);

            // check if graph holds correct variables
            for (uint i = 0; i < N; i++)
            {
                for (uint j = i + 1; j < N; j++)
                {
                    Assert.Equal(b.J[i, j], urd.Operator(r2));
                }
            }

            using var r3 = new Xorshift(1234);

            // check if graph index is reversible (Jij = Jji)
            for (uint i = 0; i < N; i++)
            {
                for (uint j = i + 1; j < N; j++)
                {
                    Assert.Equal(b.J[j, i], urd.Operator(r3));
                }
            }

            //check adj_nodes
            for (uint i = 0; i < N; i++)
            {
                ulong tot = 0;
                foreach (var elem in b.GetAdjacentNodes(i))
                {
                    tot += elem.Value;
                }
                Assert.Equal(tot, N * (N - 1) / 2 - i);
            }
            Assert.Equal(b.Edges, N - 1);

            using var c  = new Sparse <double>(N, N);
            using var r4 = new Xorshift(1234);
            for (uint i = 0; i < N; i++)
            {
                for (uint j = i; j < N; j++)
                {
                    c.J[j, i] = urd.Operator(r4);
                }
            }

            using var r5 = new Xorshift(1234);

            for (uint i = 0; i < N; i++)
            {
                for (uint j = i; j < N; j++)
                {
                    Assert.Equal(c.J[i, j], urd.Operator(r5));
                }
            }

            using var r6 = new Xorshift(1234);

            for (uint i = 0; i < N; i++)
            {
                for (uint j = i; j < N; j++)
                {
                    Assert.Equal(c.J[j, i], urd.Operator(r6));
                }
            }

            for (uint i = 0; i < N; i++)
            {
                ulong tot = 0;
                foreach (var elem in c.GetAdjacentNodes(i))
                {
                    tot += elem.Value;
                }
                Assert.Equal(tot, N * (N - 1) / 2);
            }
            Assert.Equal(c.Edges, N);
        }
 public void Max()
 {
     Assert.Equal(uint.MaxValue, Xorshift.Max());
 }
Beispiel #15
0
    public void ObjectEquality_TEST()
    {
        Xorshift random           = new Xorshift(Seed);
        double   delta            = 1.0e-6;
        double   deltaDateSeconds = 1.0e-3;

        // bool
        Assert.IsTrue(Plist.EqualObject(true, true, delta, deltaDateSeconds));
        Assert.IsTrue(Plist.EqualObject(false, false, delta, deltaDateSeconds));
        Assert.IsTrue(Plist.EqualObject(true, false, delta, deltaDateSeconds) == false);
        Assert.IsTrue(Plist.EqualObject(true, false, delta, deltaDateSeconds) == false);

        for (int i = 0; i < 100000; ++i)
        {
            int value1 = (int)random.Generate() * (random.Uniform() < 0.5 ? 1 : -1);
            int value2 = (int)random.Generate() * (random.Uniform() < 0.5 ? 1 : -1);
            Assert.IsTrue(Plist.EqualObject(value1, value1, delta, deltaDateSeconds));
            Assert.IsTrue(Plist.EqualObject(value1, value2, delta, deltaDateSeconds) == (value1 == value2));
            Assert.IsTrue(Plist.EqualObject(value1, value2, delta, deltaDateSeconds) == Plist.EqualObject(value2, value1, delta, deltaDateSeconds));
        }

        for (int i = 0; i < 100000; ++i)
        {
            double value1 = random.Uniform(-1.0e+9, 1.0e+9);
            Assert.IsTrue(Plist.EqualObject(value1, value1, delta, deltaDateSeconds));
            Assert.IsTrue(Plist.EqualObject(value1, value1 + random.Uniform(0.1, 1000.0), delta, deltaDateSeconds) == false);
            Assert.IsTrue(Plist.EqualObject(value1, value1 - random.Uniform(0.1, 1000.0), delta, deltaDateSeconds) == false);
        }

        for (int i = 0; i < 100000; ++i)
        {
            DateTime value1 = DateTime.Now.Add(TimeSpan.FromSeconds(random.Uniform(-1.0e+6, 1.0e+6)));
            Assert.IsTrue(Plist.EqualObject(value1, value1, delta, deltaDateSeconds));
            Assert.IsTrue(Plist.EqualObject(value1, value1.AddSeconds(random.Uniform(0.1, 1000.0)), delta, deltaDateSeconds) == false);
            Assert.IsTrue(Plist.EqualObject(value1, value1.AddSeconds(-random.Uniform(0.1, 1000.0)), delta, deltaDateSeconds) == false);
        }

        for (int i = 0; i < 10000; ++i)
        {
            string value1 = Arbitrary.Text();
            string value2 = Arbitrary.Text();
            Assert.IsTrue(Plist.EqualObject(value1, value1, delta, deltaDateSeconds));
            Assert.IsTrue(Plist.EqualObject(value1 + value2, value1 + value2, delta, deltaDateSeconds));
            Assert.IsTrue(Plist.EqualObject(value1, value1 + "a", delta, deltaDateSeconds) == false);
            Assert.IsTrue(Plist.EqualObject(value1, value2, delta, deltaDateSeconds) == Plist.EqualObject(value2, value1, delta, deltaDateSeconds));
            Assert.IsTrue(Plist.EqualObject(value1, value2, delta, deltaDateSeconds) == (value2 == value1));
        }

        for (int i = 0; i < 10000; ++i)
        {
            byte[] value1 = Arbitrary.BinaryData();
            byte[] valueA = value1.Concat(new byte[] { (byte)(random.Generate() & 0xFF) }).ToArray();
            byte[] valueB = value1.Concat(new byte[] { (byte)(random.Generate() & 0xFF) }).ToArray();

            Assert.IsTrue(Plist.EqualObject(valueA, valueB, delta, deltaDateSeconds) == Plist.EqualObject(valueB, valueA, delta, deltaDateSeconds));
            Assert.IsTrue(Plist.EqualObject(value1, valueA, delta, deltaDateSeconds) == false);
        }

        for (int i = 0; i < 5000; ++i)
        {
            List <object> value1 = new List <object>();
            int           n      = (int)random.Generate() % 100;
            for (int j = 0; j < n; ++j)
            {
                value1.Add(Arbitrary.PlistValue());
            }
            Assert.IsTrue(Plist.EqualObject(value1, value1, delta, deltaDateSeconds));

            // Insert Test
            List <object> value2 = new List <object>(value1);
            value2.Insert((int)random.Generate() % (value1.Count + 1), Arbitrary.PlistValue());
            Assert.IsTrue(Plist.EqualObject(value1, value2, delta, deltaDateSeconds) == false);

            // Modify Test
            if (n > 0)
            {
                List <object> value3   = new List <object>(value1);
                int           index    = (int)random.Generate() % value1.Count;
                object        newValue = Arbitrary.PlistValue();
                object        oldValue = value3[index];
                value3[index] = newValue;
                if (Plist.EqualObject(oldValue, newValue, delta, deltaDateSeconds))
                {
                    Assert.IsTrue(Plist.EqualObject(value1, value3, delta, deltaDateSeconds));
                }
                else
                {
                    Assert.IsTrue(Plist.EqualObject(value1, value3, delta, deltaDateSeconds) == false);
                }
            }
        }

        for (int i = 0; i < 1000; ++i)
        {
            Dictionary <string, object> value1 = new Dictionary <string, object>();
            int n = (int)random.Generate() % 100;
            for (int j = 0; j < n; ++j)
            {
                value1[Arbitrary.Text()] = Arbitrary.PlistValue();
            }
            Assert.IsTrue(Plist.EqualObject(value1, value1, delta, deltaDateSeconds));

            // Add Test
            Dictionary <string, object> value2 = new Dictionary <string, object>(value1);
            var newKey = Arbitrary.Text();
            if (value2.ContainsKey(newKey) == false)
            {
                value2[newKey] = Arbitrary.PlistValue();
                Assert.IsTrue(Plist.EqualObject(value1, value2, delta, deltaDateSeconds) == false);
            }

            // Modify Test
            Dictionary <string, object> value3 = new Dictionary <string, object>(value1);
            if (n > 0)
            {
                var    key      = value3.Keys.ToArray()[(int)random.Generate() % value3.Count];
                object newValue = Arbitrary.PlistValue();
                object oldValue = value3[key];
                value3[key] = newValue;

                if (Plist.EqualObject(oldValue, newValue, delta, deltaDateSeconds))
                {
                    Assert.IsTrue(Plist.EqualObject(value1, value3, delta, deltaDateSeconds));
                }
                else
                {
                    Assert.IsTrue(Plist.EqualObject(value1, value3, delta, deltaDateSeconds) == false);
                }
            }
        }
    }
 public void Min()
 {
     Assert.Equal(uint.MinValue, Xorshift.Min());
 }
        public void Create()
        {
            var xorshiftTest = new Xorshift(100);

            this.DisposeAndCheckDisposedState(xorshiftTest);
        }
Beispiel #18
0
    protected virtual void Start()
    {
        this.xorshift = new Xorshift(0);

        RandomEx.ValueFunc = this.xorshift.Value;
    }
Beispiel #19
0
        /// <summary>
        /// Run example
        /// </summary>
        /// <seealso cref="http://en.wikipedia.org/wiki/Random_number_generation">Random number generation</seealso>
        /// <seealso cref="http://en.wikipedia.org/wiki/Linear_congruential_generator">Linear congruential generator</seealso>
        /// <seealso cref="http://en.wikipedia.org/wiki/Mersenne_twister">Mersenne twister</seealso>
        /// <seealso cref="http://en.wikipedia.org/wiki/Lagged_Fibonacci_generator">Lagged Fibonacci generator</seealso>
        /// <seealso cref="http://en.wikipedia.org/wiki/Xorshift">Xorshift</seealso>
        public void Run()
        {
            // All RNG classes in MathNet have next counstructors:
            // - RNG(int seed, bool threadSafe): initializes a new instance with specific seed value and thread safe property
            // - RNG(int seed): iуууnitializes a new instance with specific seed value. Thread safe property is set to Control.ThreadSafeRandomNumberGenerators
            // - RNG(bool threadSafe) : initializes a new instance with the seed value set to DateTime.Now.Ticks and specific thread safe property
            // - RNG(bool threadSafe) : initializes a new instance with the seed value set to DateTime.Now.Ticks and thread safe property set to Control.ThreadSafeRandomNumberGenerators

            // All RNG classes in MathNet have next methods to produce random values:
            // - double[] NextDouble(int n): returns an "n"-size array of uniformly distributed random doubles in the interval [0.0,1.0];
            // - int Next(): returns a nonnegative random number;
            // - int Next(int maxValue): returns a random number less then a specified maximum;
            // - int Next(int minValue, int maxValue): returns a random number within a specified range;
            // - void NextBytes(byte[] buffer): fills the elements of a specified array of bytes with random numbers;

            // All RNG classes in MathNet have next extension methods to produce random values:
            // - long NextInt64(): returns a nonnegative random number less than "Int64.MaxValue";
            // - int NextFullRangeInt32(): returns a random number of the full Int32 range;
            // - long NextFullRangeInt64(): returns a random number of the full Int64 range;
            // - decimal NextDecimal(): returns a nonnegative decimal floating point random number less than 1.0;

            // 1. Multiplicative congruential generator using a modulus of 2^31-1 and a multiplier of 1132489760
            var mcg31M1 = new Mcg31m1(1);

            Console.WriteLine(@"1. Generate 10 random double values using Multiplicative congruential generator with a modulus of 2^31-1 and a multiplier of 1132489760");
            var randomValues = mcg31M1.NextDouble(10);

            for (var i = 0; i < randomValues.Length; i++)
            {
                Console.Write(randomValues[i].ToString("N") + @" ");
            }

            Console.WriteLine();
            Console.WriteLine();

            // 2. Multiplicative congruential generator using a modulus of 2^59 and a multiplier of 13^13
            var mcg59 = new Mcg59(1);

            Console.WriteLine(@"2. Generate 10 random integer values using Multiplicative congruential generator with a modulus of 2^59 and a multiplier of 13^13");
            for (var i = 0; i < 10; i++)
            {
                Console.Write(mcg59.Next() + @" ");
            }

            Console.WriteLine();
            Console.WriteLine();

            // 3. Random number generator using Mersenne Twister 19937 algorithm
            var mersenneTwister = new MersenneTwister(1);

            Console.WriteLine(@"3. Generate 10 random integer values less then 100 using Mersenne Twister 19937 algorithm");
            for (var i = 0; i < 10; i++)
            {
                Console.Write(mersenneTwister.Next(100) + @" ");
            }

            Console.WriteLine();
            Console.WriteLine();

            // 4. Multiple recursive generator with 2 components of order 3
            var mrg32K3A = new Mrg32k3a(1);

            Console.WriteLine(@"4. Generate 10 random integer values in range [50;100] using multiple recursive generator with 2 components of order 3");
            for (var i = 0; i < 10; i++)
            {
                Console.Write(mrg32K3A.Next(50, 100) + @" ");
            }

            Console.WriteLine();
            Console.WriteLine();

            // 5. Parallel Additive Lagged Fibonacci pseudo-random number generator
            var palf = new Palf(1);

            Console.WriteLine(@"5. Generate 10 random bytes using Parallel Additive Lagged Fibonacci pseudo-random number generator");
            var bytes = new byte[10];

            palf.NextBytes(bytes);
            for (var i = 0; i < bytes.Length; i++)
            {
                Console.Write(bytes[i] + @" ");
            }

            Console.WriteLine();
            Console.WriteLine();

            // 6. A random number generator based on the "System.Security.Cryptography.RandomNumberGenerator" class in the .NET library
            var systemCryptoRandomNumberGenerator = new SystemCryptoRandomNumberGenerator();

            Console.WriteLine(@"6. Generate 10 random decimal values using RNG based on the 'System.Security.Cryptography.RandomNumberGenerator'");
            for (var i = 0; i < 10; i++)
            {
                Console.Write(systemCryptoRandomNumberGenerator.NextDecimal().ToString("N") + @" ");
            }

            Console.WriteLine();
            Console.WriteLine();

            // 7. Wichmann-Hill’s 1982 combined multiplicative congruential generator
            var rngWh1982 = new WH1982();

            Console.WriteLine(@"7. Generate 10 random full Int32 range values using Wichmann-Hill’s 1982 combined multiplicative congruential generator");
            for (var i = 0; i < 10; i++)
            {
                Console.Write(rngWh1982.NextFullRangeInt32() + @" ");
            }

            Console.WriteLine();
            Console.WriteLine();

            // 8. Wichmann-Hill’s 2006 combined multiplicative congruential generator.
            var rngWh2006 = new WH2006();

            Console.WriteLine(@"8. Generate 10 random full Int64 range values using Wichmann-Hill’s 2006 combined multiplicative congruential generator");
            for (var i = 0; i < 10; i++)
            {
                Console.Write(rngWh2006.NextFullRangeInt32() + @" ");
            }

            Console.WriteLine();
            Console.WriteLine();

            // 9. Multiply-with-carry Xorshift pseudo random number generator
            var xorshift = new Xorshift();

            Console.WriteLine(@"9. Generate 10 random nonnegative values less than Int64.MaxValue using Multiply-with-carry Xorshift pseudo random number generator");
            for (var i = 0; i < 10; i++)
            {
                Console.Write(xorshift.NextInt64() + @" ");
            }

            Console.WriteLine();
        }
Beispiel #20
0
    private void ProfileRNGs()
    {
        // Time it takes for many RNG implementations to fill a buffer with random 32 bit floats with distribution [0,1)
        // For each RNG I list two times measures on my machine: editor with safetychecks, build without safetychecks
        // If burst job is used, it is single-threaded. Obviously, using multiple threads with multiple RNGs is faster.

        var values = new NativeArray <float>(numVals, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);

        // 220ms, 55ms
        var rs = new System.Random(1234);
        var sw = System.Diagnostics.Stopwatch.StartNew();

        for (int i = 0; i < values.Length; i++)
        {
            values[i] = (float)rs.NextDouble();
        }
        sw.Stop();
        Debug.Log("System.Random: " + sw.ElapsedMilliseconds);

        // 171ms, 40ms
        sw = System.Diagnostics.Stopwatch.StartNew();
        for (int i = 0; i < values.Length; i++)
        {
            values[i] = UnityEngine.Random.value;
        }
        sw.Stop();
        Debug.Log("Unity.Random: " + sw.ElapsedMilliseconds);

        // 245ms, 84ms
        sw = System.Diagnostics.Stopwatch.StartNew();
        var uMathRng = new Unity.Mathematics.Random(1234);

        for (int i = 0; i < values.Length; i++)
        {
            values[i] = uMathRng.NextFloat();
        }
        sw.Stop();
        Debug.Log("Unity.Mathematics.Random: " + sw.ElapsedMilliseconds);

        // 248ms, 10ms
        sw = System.Diagnostics.Stopwatch.StartNew();
        var umrj = new UMathRngJob();

        umrj.Random = uMathRng;
        umrj.Values = values;
        umrj.Schedule().Complete();
        sw.Stop();
        Debug.Log("Unity.Mathematics.Random BurstJob: " + sw.ElapsedMilliseconds);

        // 226ms, 71ms
        var rm = new Meisui.Random.MersenneTwister(1234);

        sw = System.Diagnostics.Stopwatch.StartNew();
        for (int i = 0; i < values.Length; i++)
        {
            values[i] = (float)rm.genrand_real2();
        }
        sw.Stop();
        Debug.Log("MersenneTwister Managed: " + sw.ElapsedMilliseconds);

        // 351ms, 91ms
        var rrm = new Ramjet.MersenneTwister(1234);

        sw = System.Diagnostics.Stopwatch.StartNew();
        for (int i = 0; i < values.Length; i++)
        {
            values[i] = rrm.genrand_real2();
        }
        sw.Stop();
        Debug.Log("MersenneTwister Burst: " + sw.ElapsedMilliseconds);

        // 359ms, 15ms
        sw = System.Diagnostics.Stopwatch.StartNew();
        var mtj = new MTJob();

        mtj.Values = values;
        mtj.Random = rrm;
        mtj.Schedule().Complete();
        sw.Stop();
        rrm.Dispose();
        Debug.Log("MersenneTwister BurstJob: " + sw.ElapsedMilliseconds);

        // 162ms, 76
        var xor = new Xorshift(1234);

        sw = System.Diagnostics.Stopwatch.StartNew();
        for (int i = 0; i < values.Length; i++)
        {
            values[i] = xor.NextFloat();
        }
        sw.Stop();
        Debug.Log("XORShift Managed: " + sw.ElapsedMilliseconds);

        // 1107, 21ms
        sw = System.Diagnostics.Stopwatch.StartNew();
        var xorb = new XorshiftBurst(1234);
        var xorj = new XorShiftJob();

        xorj.Values = values;
        xorj.Random = xorb;
        xorj.Schedule().Complete();
        sw.Stop();
        Debug.Log("XORShift BurstJob: " + sw.ElapsedMilliseconds);


        // Find min and max values in buffer, and turn it into a texture for visual inspection
        // Todo: do this for all RNGs, not just for the last one to generate values.

        // float min = 2f;
        // float max = -1f;

        // _tex = new Texture2D(res, res, TextureFormat.ARGB32, false, true);
        // var data = new Color[res * res];

        // for (int i = 0; i < numVals; i++) {
        //     float val = values[i];
        //     if (val > max) {
        //         max = val;
        //     }
        //     if (val < min) {
        //         min = val;
        //     }
        //     data[i] = new Color(val, val, val, 1f);
        // }

        // Debug.Log(min + ", " + max);

        // _tex.SetPixels(0, 0, res, res, data, 0);
        // _tex.Apply();

        values.Dispose();
    }
Beispiel #21
0
 public RandomLocal(UInt64 seed)
 {
     rand_ = new Xorshift();
     rand_.setSeed(seed);
 }
Beispiel #22
0
        /// <summary>
        /// CMA-ES stochastic optimizer class with ask-and-tell interface.
        /// </summary>
        /// <param name="mean">Initial mean vector of multi-variate gaussian distributions.</param>
        /// <param name="sigma">Initial standard deviation of covariance matrix.</param>
        /// <param name="bounds">(Optional) Lower and upper domain boundaries for each parameter, (n_dim, 2)-dim matrix.</param>
        /// <param name="nMaxResampling">(Optional) A maximum number of resampling parameters (default: 100).
        /// If all sampled parameters are infeasible, the last sampled one  will be clipped with lower and upper bounds.</param>
        /// <param name="seed">(Optional) A seed number.</param>
        /// <param name="tol_sigma">(Optional) Threshold for determining the convergence of sigma.</param>
        /// <param name="tol_C">(Optional) Threshold for determining the convergence of Covariance matrix.</param>
        public CMA(IList <double> mean, double sigma, Matrix <double> bounds = null, int nMaxResampling = 100, int seed = 0, double tol_sigma = 1e-4, double tol_C = 1e-4)
        {
            if (!(sigma > 0))
            {
                throw new ArgumentOutOfRangeException("sigma must be non-zero positive value");
            }

            int nDim = mean.Count;

            if (!(nDim > 1))
            {
                throw new ArgumentOutOfRangeException("The dimension of mean must be larger than 1");
            }

            int populationSize = 4 + (int)Math.Floor(3 * Math.Log(nDim));  // # (eq. 48)

            int mu = populationSize / 2;

            Vector <double> weightsPrime = Vector <double> .Build.Dense(populationSize);

            for (int i = 0; i < populationSize; i++)
            {
                weightsPrime[i] = Math.Log((populationSize + 1) / (double)2) - Math.Log(i + 1);
            }

            Vector <double> weightsPrimeMuEff = Vector <double> .Build.Dense(weightsPrime.Take(mu).ToArray());

            double          mu_eff = Math.Pow(weightsPrimeMuEff.Sum(), 2) / Math.Pow(weightsPrimeMuEff.L2Norm(), 2);
            Vector <double> weightsPrimeMuEffMinus = Vector <double> .Build.Dense(weightsPrime.Skip(mu).ToArray());

            double muEffMinus = Math.Pow(weightsPrimeMuEffMinus.Sum(), 2) / Math.Pow(weightsPrimeMuEffMinus.L2Norm(), 2);

            int    alphacCov = 2;
            double c1        = alphacCov / (Math.Pow(nDim + 1.3, 2) + mu_eff);
            double cmu       = Math.Min(1 - c1, alphacCov * (mu_eff - 2 + (1 / mu_eff)) / (Math.Pow(nDim + 2, 2) + (alphacCov * mu_eff / 2)));

            if (!(c1 <= 1 - cmu))
            {
                throw new Exception("invalid learning rate for the rank-one update");
            }
            if (!(cmu <= 1 - c1))
            {
                throw new Exception("invalid learning rate for the rank-μ update");
            }

            double minAlpha = Math.Min(1 + (c1 / cmu), Math.Min(1 + (2 * muEffMinus / (mu_eff + 2)), (1 - c1 - cmu) / (nDim * cmu)));

            double positiveSum = weightsPrime.Where(x => x > 0).Sum();
            double negativeSum = Math.Abs(weightsPrime.Where(x => x < 0).Sum());

            Vector <double> weights = Vector <double> .Build.Dense(weightsPrime.Count);

            weightsPrime.CopyTo(weights);
            bool[] weightsIsNotNegative = weightsPrime.Select(x => x >= 0).ToArray();
            for (int i = 0; i < weights.Count; i++)
            {
                weights[i] = weightsIsNotNegative[i] ? 1 / positiveSum * weightsPrime[i] : minAlpha / negativeSum * weightsPrime[i];
            }
            int cm = 1;

            double c_sigma = (mu_eff + 2) / (nDim + mu_eff + 5);
            double d_sigma = 1 + (2 * Math.Max(0, Math.Sqrt((mu_eff - 1) / (nDim + 1)) - 1)) + c_sigma;

            if (!(c_sigma < 1))
            {
                throw new Exception("invalid learning rate for cumulation for the step-size control");
            }

            double cc = (4 + (mu_eff / nDim)) / (nDim + 4 + (2 * mu_eff / nDim));

            if (!(cc <= 1))
            {
                throw new Exception("invalid learning rate for cumulation for the rank-one update");
            }

            Dim            = nDim;
            PopulationSize = populationSize;
            _mu            = mu;
            _mu_eff        = mu_eff;

            _cc      = cc;
            _c1      = c1;
            _cmu     = cmu;
            _c_sigma = c_sigma;
            _d_sigma = d_sigma;
            _cm      = cm;

            _chi_n = Math.Sqrt(Dim) * (1.0 - (1.0 / (4.0 * Dim)) + 1.0 / (21.0 * (Math.Pow(Dim, 2))));

            _weights = weights;

            _p_sigma = Vector <double> .Build.Dense(Dim, 0);

            _pc = Vector <double> .Build.Dense(Dim, 0);

            _mean = Vector <double> .Build.DenseOfArray(mean.ToArray());

            _C = Matrix <double> .Build.DenseIdentity(Dim, Dim);

            _sigma = sigma;

            if (!(bounds == null || (bounds.RowCount == Dim && bounds.ColumnCount == 2)))
            {
                throw new Exception("bounds should be (n_dim, 2)-dim matrix");
            }
            _bounds           = bounds;
            _n_max_resampling = nMaxResampling;

            Generation = 0;
            _rng       = new Xorshift(seed);

            _epsilon = 1e-8;

            _tol_sigma = tol_sigma;
            _tol_C     = tol_C;
        }
Beispiel #23
0
 protected virtual void Start()
 {
     xorshift = new Xorshift(0);
 }