added the project files

This commit is contained in:
2024-06-28 09:25:34 -04:00
parent 0b8b0ee658
commit 84a1c84250
43 changed files with 1494 additions and 0 deletions

View 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;
}
}

View 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

View 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

View 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