Skip to content

Commit a9f48d7

Browse files
committed
dlib.random
1 parent ac46035 commit a9f48d7

File tree

4 files changed

+125
-1
lines changed

4 files changed

+125
-1
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ Currently dlib consists of the following packages:
2727
* [dlib.memory](https://gecko0307.github.io/dlib/docs/dlib/memory.html) - memory allocators
2828
* [dlib.text](https://gecko0307.github.io/dlib/docs/dlib/text.html) - text processing, GC-free strings, Unicode decoding and encoding
2929
* [dlib.serialization](https://gecko0307.github.io/dlib/docs/dlib/serialization.html) - data serialization (XML and JSON parsers)
30+
* [dlib.random](https://gecko0307.github.io/dlib/docs/dlib/random.html) - random number generation
3031
* [dlib.coding](https://gecko0307.github.io/dlib/docs/dlib/coding.html) - various data compression and coding algorithms
3132
* [dlib.concurrency](https://gecko0307.github.io/dlib/docs/dlib/concurrency.html) - a thread pool.
3233

dlib/package.d

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,9 @@ DEALINGS IN THE SOFTWARE.
6868
*
6969
* - $(LINK2 dlib/memory.html, dlib.memory) - memory allocators
7070
*
71-
* - $(LINK2 dlib/text.html, dlib.text) - text processing, GC-free strings, Unicode decoding and encoding
71+
* - $(LINK2 dlib/text.html, dlib.text) - text processing, GC-free strings, Unicode decoding and encoding
72+
*
73+
* - $(LINK2 dlib/random.html, dlib.random) - random number generation
7274
*
7375
* - $(LINK2 dlib/serialization.html, dlib.serialization) - data serialization (XML and JSON parsers)
7476
*
@@ -95,6 +97,7 @@ public
9597
import dlib.math;
9698
import dlib.memory;
9799
import dlib.network;
100+
import dlib.random;
98101
import dlib.serialization;
99102
import dlib.text;
100103
}

dlib/random/package.d

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
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+
module dlib.random;
30+
31+
public
32+
{
33+
import dlib.random.random;
34+
}

dlib/random/random.d

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
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

Comments
 (0)