E-MailRelay
grandom.cpp
Go to the documentation of this file.
1//
2// Copyright (C) 2001-2021 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 <ctime>
24#include <chrono>
25#include <random>
26
27unsigned int G::Random::rand( unsigned int start , unsigned int end )
28{
29 static std::default_random_engine e ; // NOLINT cert-msc32-c
30
31 static bool seeded = false ;
32 if( !seeded )
33 {
34 #if defined(G_WINDOWS)
35 std::random_device r ;
36 #else
37 std::random_device r( "/dev/urandom" ) ;
38 #endif
39
40 using seed_t = std::random_device::result_type ;
41 seed_t seed_1 = 0U ;
42 try { seed_1 = r() ; } catch( std::exception & ) {}
43
44 auto tp = std::chrono::high_resolution_clock::now() ;
45 auto seed_2 = static_cast<seed_t>( tp.time_since_epoch().count() ) ;
46
47 std::seed_seq seq{ seed_1 , seed_2 } ;
48 e.seed( seq ) ;
49 seeded = true ;
50 }
51
52 std::uniform_int_distribution<unsigned int> dist( start , end ) ;
53 return dist( e ) ;
54}
55
unsigned int rand(unsigned int start=0U, unsigned int end=32767)
Returns a random value, automatically seeded on first use.
Definition: grandom.cpp:27