mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-03 21:40:52 -05:00 
			
		
		
		
	
		
			
	
	
		
			102 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			102 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <cmath>
							 | 
						||
| 
								 | 
							
								#include <algorithm>
							 | 
						||
| 
								 | 
							
								#include "Random.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Random::bubbleSort(int a[], int size)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  for(int pass=1; pass<size; pass++) {
							 | 
						||
| 
								 | 
							
								    for(int i=0;i<size-pass;i++)
							 | 
						||
| 
								 | 
							
								      if(a[i]>a[i+1]){
							 | 
						||
| 
								 | 
							
									std::swap(a[i], a[i+1]);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								double Random::gauss(double sdev, double mean)
							 | 
						||
| 
								 | 
							
								{ 
							 | 
						||
| 
								 | 
							
								  double sum=0.0;
							 | 
						||
| 
								 | 
							
								  for (int i=1;i<=12;++i)
							 | 
						||
| 
								 | 
							
								    { 
							 | 
						||
| 
								 | 
							
								      seed_u = 1664525lu * seed_u + 123456789lu; 
							 | 
						||
| 
								 | 
							
								      sum+=double(seed_u); 
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  return (sum/4.29497e9-6.0)*sdev+mean;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								double Random::uniform(double a, double b)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  double t;
							 | 
						||
| 
								 | 
							
								  for(int i=0; i<10;i++){
							 | 
						||
| 
								 | 
							
								    seed=2045*seed+1;
							 | 
						||
| 
								 | 
							
								    //seed=seed -(seed/1048576)*1048576;
							 | 
						||
| 
								 | 
							
								    seed%=1048576;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  t=seed/1048576.0;
							 | 
						||
| 
								 | 
							
								  t=a+(b-a)*t;
							 | 
						||
| 
								 | 
							
								  return(t);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int Random::uniform(int  a, int b) // [a, b-1]
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  double t;
							 | 
						||
| 
								 | 
							
								  int i, tt;
							 | 
						||
| 
								 | 
							
								  if(b==a+1) return(a);
							 | 
						||
| 
								 | 
							
								  for(i=0; i<10;i++){
							 | 
						||
| 
								 | 
							
								    seed=2045*seed+1;
							 | 
						||
| 
								 | 
							
								    //seed=seed -(seed/1048576)*1048576;
							 | 
						||
| 
								 | 
							
								    seed%=1048576;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  t=seed/1048576.0;
							 | 
						||
| 
								 | 
							
								  t=a+(b-a)*t;
							 | 
						||
| 
								 | 
							
								  tt=(int)t;
							 | 
						||
| 
								 | 
							
								  if(tt<a) tt=a;
							 | 
						||
| 
								 | 
							
								  else if(tt>=b) tt=b-1;
							 | 
						||
| 
								 | 
							
								  return(tt);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int Random::nonUniform(int  a, int b) // [a, b-1]
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  double t;
							 | 
						||
| 
								 | 
							
								  int i, tt;
							 | 
						||
| 
								 | 
							
								  if(b==a+1) return(a);
							 | 
						||
| 
								 | 
							
								  for(i=0; i<10;i++){
							 | 
						||
| 
								 | 
							
								    seed=2045*seed+1;
							 | 
						||
| 
								 | 
							
								    //seed=seed -(seed/1048576)*1048576;
							 | 
						||
| 
								 | 
							
								    seed%=1048576;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  t=seed/1048576.0;
							 | 
						||
| 
								 | 
							
								  t=a+(b-a)*pow(t, 0.6667); //t^1.5 
							 | 
						||
| 
								 | 
							
								  tt=(int)t;
							 | 
						||
| 
								 | 
							
								  if(tt<a) tt=a;
							 | 
						||
| 
								 | 
							
								  else if(tt>=b) tt=b-1;
							 | 
						||
| 
								 | 
							
								  return(tt);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								void m_uniform(int a , int b, long int *seed, int *itmp, int num)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  int index, imed, i, k;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  index=0;
							 | 
						||
| 
								 | 
							
								  itmp[0]=uniform(a, b, seed);
							 | 
						||
| 
								 | 
							
								 Loop1:
							 | 
						||
| 
								 | 
							
								  imed=uniform(a, b, seed);
							 | 
						||
| 
								 | 
							
								  k=0;
							 | 
						||
| 
								 | 
							
								  for(i=0;i<=index;i++)
							 | 
						||
| 
								 | 
							
								    if(imed==itmp[i]) {k=1; break;}
							 | 
						||
| 
								 | 
							
								  if(k==0) {index++; itmp[index]=imed;}
							 | 
						||
| 
								 | 
							
								  if(index<num-1) goto Loop1;
							 | 
						||
| 
								 | 
							
								  bubble(itmp, num); //bubble sorting
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |