{"id":92,"date":"2020-06-24T04:17:22","date_gmt":"2020-06-24T04:17:22","guid":{"rendered":"https:\/\/michaeljohnsteiner.com\/?p=92"},"modified":"2020-06-25T00:48:30","modified_gmt":"2020-06-25T00:48:30","slug":"random64d-cs","status":"publish","type":"post","link":"https:\/\/michaeljohnsteiner.com\/index.php\/2020\/06\/24\/random64d-cs\/","title":{"rendered":"Random64d.cs"},"content":{"rendered":"\n<p>64 Bit Version of Random<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using System;\nusing System.Runtime.InteropServices;\nusing System.Security.Cryptography;\n[Serializable]\npublic class Random64d : RandomNumberGenerator\n{\n    private const                    double                   DBi  = 1.0 \/ 9223372036854775807;\n    private const                    double                   DBui = 1.0 \/ ulong.MaxValue;\n    private readonly                 Random                   _r1;\n    private readonly                 Random                   _r2;\n    [NonSerialized] private readonly RNGCryptoServiceProvider _rng = new RNGCryptoServiceProvider();\n    private                          RNumber                  _rNumber;\n    public Random64d() : this(((long) (uint) Environment.TickCount &lt;&lt; 32) | (uint) Environment.TickCount)\n    {\n    }\n    public Random64d(long Seed)\n    {\n        var Seed0 = (int) (((Seed ^ 0x86B28CAB) &lt;&lt; 16) &amp; 0x7fffffff);\n        var Seed1 = (int) (Seed                        &amp; 0x7fffffff);\n        _r1 = new Random(Seed0);\n        _r2 = new Random(Seed1);\n    }\n    public long InternalSample()\n    {\n        _rNumber.n1 = _r1.Next();\n        _rNumber.n2 = _r2.Next();\n        return _rNumber.total;\n    }\n    private double GetSampleForLargeRange()\n    {\n        var value = InternalSample();\n        if (InternalSample() % 2 == 0)\n            value = -value;\n        return (value + 4611686018427387903.0) \/ 9223372036854775807.0;\n    }\n    private double Sample()\n    {\n        return InternalSample() * DBi;\n    }\n    public long Next()\n    {\n        return InternalSample();\n    }\n    public long Next(long minValue, long maxValue)\n    {\n        if (minValue > maxValue)\n            throw new ArgumentException(\"maxValue must be greater than or equal to minValue\");\n        var num = (ulong) maxValue - (ulong) minValue;\n        if (num &lt;= long.MaxValue)\n            return (long) (Sample() * num) + minValue;\n        return (long) ((ulong) (GetSampleForLargeRange() * num) + (ulong) minValue);\n    }\n    public ulong Next(ulong minValue, ulong maxValue)\n    {\n        if (minValue > maxValue)\n            throw new ArgumentException(\"maxValue must be greater than or equal to minValue\");\n        var num = maxValue - minValue;\n        return (ulong) (InternalSample() * DBui * num) + minValue;\n    }\n    public long Next(long maxValue)\n    {\n        if (maxValue &lt; 0)\n            throw new ArgumentException(\"maxValue must be greater than zero.\");\n        return (long) (Sample() * maxValue);\n    }\n    public ulong Next(ulong maxValue)\n    {\n        return (ulong) (InternalSample() * DBui * maxValue);\n    }\n    public double NextDouble()\n    {\n        return Sample();\n    }\n    public byte[] GetNextByteArray(int size)\n    {\n        var ba = new byte[size];\n        _rng.GetBytes(ba);\n        return ba;\n    }\n    public byte[] GetNextByteArrayFn(int size)\n    {\n        var ba = new byte[size];\n        for (var i = 0; i &lt; size; ++i)\n            ba[i] = (byte) Next(0, 256);\n        return ba;\n    }\n    public char[] GetNextCharArray(int size)\n    {\n        var ca = new char[size];\n        for (var i = 0; i &lt; size; ++i)\n            ca[i] = (char)Next(32, 128);\n        return ca;\n    }\n    public string GetRandomString(int minLen, int maxLen)\n    {\n        if (minLen == maxLen)\n            return new string(GetNextCharArray(minLen));\n        return new string(GetNextCharArray((int) Next(minLen, maxLen)));\n    }\n    public override void GetBytes(byte[] data)\n    {\n        if (data == null)\n            throw new ArgumentException(\"The buffer cannot be null.\");\n        _rng.GetBytes(data);\n    }\n    [StructLayout(LayoutKind.Explicit, Size = 8, Pack = 1)]\n    [Serializable]\n    public struct RNumber\n    {\n        [FieldOffset(0)] public long n1;\n        [FieldOffset(4)] public long n2;\n        [FieldOffset(0)] public long total;\n    }\n}<\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>64 Bit Version of Random<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[36,38,37,39],"_links":{"self":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/92"}],"collection":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/comments?post=92"}],"version-history":[{"count":2,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/92\/revisions"}],"predecessor-version":[{"id":94,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/92\/revisions\/94"}],"wp:attachment":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/media?parent=92"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/categories?post=92"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/tags?post=92"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}