|
| 1 | +/* |
| 2 | +Copyright (c) 2024 Timur Gafarov |
| 3 | +
|
| 4 | +Boost Software License - Version 1.0 - August 17th, 2003 |
| 5 | +
|
| 6 | +Permission is hereby granted, free of charge, to any person or organization |
| 7 | +obtaining a copy of the software and accompanying documentation covered by |
| 8 | +this license (the "Software") to use, reproduce, display, distribute, |
| 9 | +execute, and transmit the Software, and to prepare derivative works of the |
| 10 | +Software, and to permit third-parties to whom the Software is furnished to |
| 11 | +do so, all subject to the following: |
| 12 | +
|
| 13 | +The copyright notices in the Software and this entire statement, including |
| 14 | +the above license grant, this restriction and the following disclaimer, |
| 15 | +must be included in all copies of the Software, in whole or in part, and |
| 16 | +all derivative works of the Software, unless such copies or derivative |
| 17 | +works are solely in the form of machine-executable object code generated by |
| 18 | +a source language processor. |
| 19 | +
|
| 20 | +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| 21 | +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| 22 | +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT |
| 23 | +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE |
| 24 | +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, |
| 25 | +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
| 26 | +DEALINGS IN THE SOFTWARE. |
| 27 | +*/ |
| 28 | + |
| 29 | +/** |
| 30 | + * Pseudo-random numbers based on C rand function |
| 31 | + * |
| 32 | + * Copyright: Timur Gafarov 2024. |
| 33 | + * License: $(LINK2 boost.org/LICENSE_1_0.txt, Boost License 1.0). |
| 34 | + * Authors: Timur Gafarov |
| 35 | + */ |
| 36 | +module dlib.random.random; |
| 37 | + |
| 38 | +import core.stdc.stdlib; |
| 39 | +import core.stdc.time; |
| 40 | +import core.thread.osthread: getpid; |
| 41 | +import std.math; |
| 42 | +import std.algorithm: sum; |
| 43 | + |
| 44 | +static this() |
| 45 | +{ |
| 46 | + srand(cast(uint)seed()); |
| 47 | +} |
| 48 | + |
| 49 | +auto seed() |
| 50 | +{ |
| 51 | + return mix(clock(), time(null), getpid()); |
| 52 | +} |
| 53 | + |
| 54 | +/** |
| 55 | + * Bob Jenkins' 96 bit mix function |
| 56 | + */ |
| 57 | +ulong mix(ulong a, ulong b, ulong c) |
| 58 | +{ |
| 59 | + a=a-b; a=a-c; a=a^(c >> 13); |
| 60 | + b=b-c; b=b-a; b=b^(a << 8); |
| 61 | + c=c-a; c=c-b; c=c^(b >> 13); |
| 62 | + a=a-b; a=a-c; a=a^(c >> 12); |
| 63 | + b=b-c; b=b-a; b=b^(a << 16); |
| 64 | + c=c-a; c=c-b; c=c^(b >> 5); |
| 65 | + a=a-b; a=a-c; a=a^(c >> 3); |
| 66 | + b=b-c; b=b-a; b=b^(a << 10); |
| 67 | + c=c-a; c=c-b; c=c^(b >> 15); |
| 68 | + return c; |
| 69 | +} |
| 70 | + |
| 71 | +/** |
| 72 | + * Returns pseudo-random integer between mi (inclusive) and ma (exclusive) |
| 73 | + */ |
| 74 | +int randomInRange(int mi, int ma) |
| 75 | +{ |
| 76 | + return (rand() % (ma - mi)) + mi; |
| 77 | +} |
| 78 | + |
| 79 | +/** |
| 80 | + * Returns pseudo-random floating-point number in 0..1 range |
| 81 | + */ |
| 82 | +T random(T)() |
| 83 | +{ |
| 84 | + T res = (rand() % RAND_MAX) / cast(T)RAND_MAX; |
| 85 | + return res; |
| 86 | +} |
0 commit comments