From a9f48d7f4db27b46c3f3ef62ad9c69172fe85a4d Mon Sep 17 00:00:00 2001 From: Timur Gafarov Date: Tue, 23 Jan 2024 22:58:02 +0300 Subject: [PATCH] dlib.random --- README.md | 1 + dlib/package.d | 5 ++- dlib/random/package.d | 34 +++++++++++++++++ dlib/random/random.d | 86 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 dlib/random/package.d create mode 100644 dlib/random/random.d diff --git a/README.md b/README.md index b544532c..bfeb174a 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ Currently dlib consists of the following packages: * [dlib.memory](https://gecko0307.github.io/dlib/docs/dlib/memory.html) - memory allocators * [dlib.text](https://gecko0307.github.io/dlib/docs/dlib/text.html) - text processing, GC-free strings, Unicode decoding and encoding * [dlib.serialization](https://gecko0307.github.io/dlib/docs/dlib/serialization.html) - data serialization (XML and JSON parsers) +* [dlib.random](https://gecko0307.github.io/dlib/docs/dlib/random.html) - random number generation * [dlib.coding](https://gecko0307.github.io/dlib/docs/dlib/coding.html) - various data compression and coding algorithms * [dlib.concurrency](https://gecko0307.github.io/dlib/docs/dlib/concurrency.html) - a thread pool. diff --git a/dlib/package.d b/dlib/package.d index 7000d0cf..6524193c 100644 --- a/dlib/package.d +++ b/dlib/package.d @@ -68,7 +68,9 @@ DEALINGS IN THE SOFTWARE. * * - $(LINK2 dlib/memory.html, dlib.memory) - memory allocators * - * - $(LINK2 dlib/text.html, dlib.text) - text processing, GC-free strings, Unicode decoding and encoding + * - $(LINK2 dlib/text.html, dlib.text) - text processing, GC-free strings, Unicode decoding and encoding + * + * - $(LINK2 dlib/random.html, dlib.random) - random number generation * * - $(LINK2 dlib/serialization.html, dlib.serialization) - data serialization (XML and JSON parsers) * @@ -95,6 +97,7 @@ public import dlib.math; import dlib.memory; import dlib.network; + import dlib.random; import dlib.serialization; import dlib.text; } diff --git a/dlib/random/package.d b/dlib/random/package.d new file mode 100644 index 00000000..10f03a53 --- /dev/null +++ b/dlib/random/package.d @@ -0,0 +1,34 @@ +/* +Copyright (c) 2024 Timur Gafarov + +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +*/ + +module dlib.random; + +public +{ + import dlib.random.random; +} diff --git a/dlib/random/random.d b/dlib/random/random.d new file mode 100644 index 00000000..d7308e5d --- /dev/null +++ b/dlib/random/random.d @@ -0,0 +1,86 @@ +/* +Copyright (c) 2024 Timur Gafarov + +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +*/ + +/** + * Pseudo-random numbers based on C rand function + * + * Copyright: Timur Gafarov 2024. + * License: $(LINK2 boost.org/LICENSE_1_0.txt, Boost License 1.0). + * Authors: Timur Gafarov + */ +module dlib.random.random; + +import core.stdc.stdlib; +import core.stdc.time; +import core.thread.osthread: getpid; +import std.math; +import std.algorithm: sum; + +static this() +{ + srand(cast(uint)seed()); +} + +auto seed() +{ + return mix(clock(), time(null), getpid()); +} + +/** + * Bob Jenkins' 96 bit mix function + */ +ulong mix(ulong a, ulong b, ulong c) +{ + a=a-b; a=a-c; a=a^(c >> 13); + b=b-c; b=b-a; b=b^(a << 8); + c=c-a; c=c-b; c=c^(b >> 13); + a=a-b; a=a-c; a=a^(c >> 12); + b=b-c; b=b-a; b=b^(a << 16); + c=c-a; c=c-b; c=c^(b >> 5); + a=a-b; a=a-c; a=a^(c >> 3); + b=b-c; b=b-a; b=b^(a << 10); + c=c-a; c=c-b; c=c^(b >> 15); + return c; +} + +/** + * Returns pseudo-random integer between mi (inclusive) and ma (exclusive) + */ +int randomInRange(int mi, int ma) +{ + return (rand() % (ma - mi)) + mi; +} + +/** + * Returns pseudo-random floating-point number in 0..1 range + */ +T random(T)() +{ + T res = (rand() % RAND_MAX) / cast(T)RAND_MAX; + return res; +}