E-MailRelay
grandom.cpp
Go to the documentation of this file.
1//
2// Copyright (C) 2001-2024 Graeme Walker <graeme_walker@users.sourceforge.net>
3//
4// This program is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published by
6// the Free Software Foundation, either version 3 of the License, or
7// (at your option) any later version.
8//
9// This program is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12// GNU General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with this program. If not, see <http://www.gnu.org/licenses/>.
16// ===
17///
18/// \file grandom.cpp
19///
20
21#include "gdef.h"
22#include "grandom.h"
23#include "gprocess.h"
24#include <ctime>
25#include <chrono>
26#include <random>
27
28unsigned int G::Random::rand( unsigned int start , unsigned int end )
29{
30 static std::default_random_engine e ; // NOLINT cert-msc32-c
31
32 static bool seeded = false ;
33 if( !seeded )
34 {
35 #if defined(G_WINDOWS)
36 std::random_device r ;
37 #else
38 std::random_device r( "/dev/urandom" ) ;
39 #endif
40
41 using seed_t = std::random_device::result_type ;
42 seed_t seed_1 = 0U ;
43 try { seed_1 = r() ; } catch( std::exception & ) {}
44
45 auto tp = std::chrono::high_resolution_clock::now() ;
46 auto seed_2 = static_cast<seed_t>( tp.time_since_epoch().count() ) ;
47
48 seed_t seed_3 = G::Process::Id().seed<seed_t>() ;
49
50 std::seed_seq seq{ seed_1 , seed_2 , seed_3 } ;
51 e.seed( seq ) ;
52 seeded = true ;
53 }
54
55 std::uniform_int_distribution<unsigned int> dist( start , end ) ;
56 return dist( e ) ;
57}
58
Process-id class.
Definition: gprocess.h:167
unsigned int rand(unsigned int start=0U, unsigned int end=32767)
Returns a random value, uniformly distributed over the given range (including 'start' and 'end'),...
Definition: grandom.cpp:28