added the project files
This commit is contained in:
26
projects/randomNumberGeneratorExamples/PRNG.cc
Normal file
26
projects/randomNumberGeneratorExamples/PRNG.cc
Normal file
@ -0,0 +1,26 @@
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
using namespace std;
|
||||
#include <unistd.h> // getpid
|
||||
#include "PRNG.h"
|
||||
|
||||
PRNG prng1, prng2, prng3; // global, normally one generator for entire program
|
||||
extern PRNG prng1; // declaration to use prng1 in another translation unit
|
||||
|
||||
int main() {
|
||||
uint32_t seed = getpid(); // start with a pseudo random-number
|
||||
prng1.seed( seed ); // synchronize all generators with same seed
|
||||
prng2.seed( seed );
|
||||
prng3.seed( seed );
|
||||
|
||||
// check 3 forms of generation are identical for 3 generators
|
||||
for ( int i = 0; i < 10; i += 1 ) { // generate 10 random numbers between 0-1
|
||||
cout << prng1() % 2 << prng2( 1 ) << prng3( 0, 1 ) << endl;
|
||||
}
|
||||
cout << endl;
|
||||
for ( int i = 0; i < 10; i += 1 ) { // generate 10 random numbers between 5-21
|
||||
cout << setw( 2 ) << prng1() % 17 + 5 << " "; // 0-16 + 5 = 5-21
|
||||
cout << setw( 2 ) << prng2( 16 ) + 5 << " ";
|
||||
cout << setw( 2 ) << prng3( 5, 21 ) << endl;
|
||||
}
|
||||
}
|
51
projects/randomNumberGeneratorExamples/PRNG.h
Normal file
51
projects/randomNumberGeneratorExamples/PRNG.h
Normal file
@ -0,0 +1,51 @@
|
||||
// Pseudo Random Number Generator : generate repeatable sequence of values that
|
||||
// appear random by scrambling the bits of a 32-bit integer value.
|
||||
//
|
||||
// Interface :
|
||||
// PRNG(s) - set starting seed
|
||||
// seed() - read seed
|
||||
// seed(s) - reset seed
|
||||
// prng() - generate random value in range [0,UINT_MAX]
|
||||
// prng(u) - generate random value in range [0,u]
|
||||
// prng(l,u) - generate random value in range [l,u]
|
||||
//
|
||||
// Examples : generate random number between 5-21
|
||||
// prng() % 17 + 5 values 0-16 + 5 = 5-21
|
||||
// prng( 16 ) + 5
|
||||
// prng( 5, 21 )
|
||||
|
||||
#ifndef __PRNG_H__
|
||||
#define __PRNG_H__
|
||||
|
||||
#include <cstdint> // uint32_t
|
||||
#include <cassert> // assert
|
||||
|
||||
class PRNG {
|
||||
uint32_t seed_; // same results on 32/64-bit architectures
|
||||
public:
|
||||
PRNG( uint32_t s = 362436069 ) { // default seed
|
||||
seed_ = s; // set seed
|
||||
assert( ((void)"invalid seed", seed_ != 0) );
|
||||
}
|
||||
uint32_t seed() { // read seed
|
||||
return seed_;
|
||||
}
|
||||
void seed( uint32_t s ) { // reset seed
|
||||
seed_ = s; // set seed
|
||||
assert( ((void)"invalid seed", seed_ != 0) );
|
||||
}
|
||||
uint32_t operator()() { // [0,UINT_MAX]
|
||||
seed_ = 36969 * (seed_ & 65535) + (seed_ >> 16); // scramble bits
|
||||
return seed_;
|
||||
}
|
||||
uint32_t operator()( uint32_t u ) { // [0,u]
|
||||
assert( ((void)"invalid random range", u < (uint32_t)-1) );
|
||||
return operator()() % (u + 1); // call operator()()
|
||||
}
|
||||
uint32_t operator()( uint32_t l, uint32_t u ) { // [l,u]
|
||||
assert( ((void)"invalid random range", l <= u) );
|
||||
return operator()( u - l ) + l; // call operator()( uint32_t )
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
53
projects/randomNumberGeneratorExamples/shuffle.cc
Normal file
53
projects/randomNumberGeneratorExamples/shuffle.cc
Normal file
@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Example of using the <algorithm> std::shuffle and seeding a random number generator with either
|
||||
* the command-line argument provided seed integer, or the current system time if there is no
|
||||
* argument provided. Based off of the example at:
|
||||
*
|
||||
* http://www.cplusplus.com/reference/algorithm/shuffle/
|
||||
*
|
||||
* Last updated: 2020-10-06
|
||||
* Copyright 2020 UW. All rights reserved.
|
||||
*
|
||||
*/
|
||||
//
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <stdexcept>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
#include <random>
|
||||
#include <chrono>
|
||||
|
||||
void print( std::vector<int> const & v ) {
|
||||
for ( int i : v ) std::cout << i << ' ';
|
||||
std::cout << std::endl;
|
||||
}
|
||||
|
||||
int main( int argc, char * argv[] ) {
|
||||
std::vector<int> v = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
|
||||
|
||||
// use a time-based seed for the default seed value
|
||||
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
|
||||
|
||||
if ( argc > 1 ) {
|
||||
try {
|
||||
seed = std::stoi( std::string{ argv[1] } );
|
||||
} catch( std::invalid_argument & e ) {
|
||||
std::cerr << e.what() << std::endl;
|
||||
return 1;
|
||||
} catch( std::out_of_range & e ) {
|
||||
std::cerr << e.what() << std::endl;
|
||||
return -1;
|
||||
} // catch
|
||||
} // if
|
||||
|
||||
std::default_random_engine rng{seed};
|
||||
|
||||
for ( int i = 0; i < 1000; i++ ) {
|
||||
//std::shuffle( v.begin(), v.end(), std::default_random_engine(seed) );
|
||||
std::shuffle( v.begin(), v.end(), rng );
|
||||
print(v);
|
||||
} // for
|
||||
|
||||
return 0;
|
||||
} // main
|
26
projects/randomNumberGeneratorExamples/srand.cc
Normal file
26
projects/randomNumberGeneratorExamples/srand.cc
Normal file
@ -0,0 +1,26 @@
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <stdlib.h> // srand/rand
|
||||
#include <sys/types.h> // getpid
|
||||
#include <unistd.h>
|
||||
using namespace std;
|
||||
|
||||
void createRandomRow(int*& row, int size) {
|
||||
row = new int[size];
|
||||
for (int i = 0; i < size; ++i) row[i] = rand()%100;
|
||||
} // createRandomRow
|
||||
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
int seed = getpid();
|
||||
if ( argc == 2 ) seed = stoi(string{argv[1]});
|
||||
srand(seed); // only seed the random number generator once!
|
||||
|
||||
int *row = nullptr;
|
||||
int size = rand() % 5 + 5;
|
||||
createRandomRow(row, size);
|
||||
cout << "row: ";
|
||||
for (int i = 0; i < size; ++i) cout << row[i] << ' ';
|
||||
cout << endl;
|
||||
delete [] row;
|
||||
} // main
|
Reference in New Issue
Block a user