File: randomgen.cpp

package info (click to toggle)
megaglest 3.13.0-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 12,844 kB
  • ctags: 18,191
  • sloc: cpp: 144,280; ansic: 11,861; sh: 3,233; perl: 1,904; python: 1,751; objc: 142; asm: 42; makefile: 24
file content (109 lines) | stat: -rw-r--r-- 3,210 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// ==============================================================
//	This file is part of MegaGlest Shared Library (www.megaglest.org)
//
//	Copyright (C) 2012 Mark Vejvoda, Titus Tscharntke
//                2001-2008 MartiƱo Figueroa
//
//	You can redistribute this code and/or modify it under
//	the terms of the GNU General Public License as published
//	by the Free Software Foundation; either version 2 of the
//	License, or (at your option) any later version
// ==============================================================

#include "randomgen.h"
#include <cassert>
#include "util.h"
#include <stdexcept>
#include "platform_util.h"
#include "math_util.h"
#include "leak_dumper.h"

using namespace std;
using namespace Shared::Graphics;

namespace Shared { namespace Util {

// =====================================================
//	class RandomGen
// =====================================================

const int RandomGen::m= 714025;
const int RandomGen::a= 1366;
const int RandomGen::b= 150889;

RandomGen::RandomGen() {
	lastNumber= 0;
	disableLastCallerTracking = false;
}

void RandomGen::init(int seed){
	lastNumber= seed % m;
}

int RandomGen::rand(string lastCaller) {
	if(lastCaller != "") {
		this->lastCaller.push_back(lastCaller);
	}
	this->lastNumber = (a*lastNumber + b) % m;
	return lastNumber;
}

std::string RandomGen::getLastCaller() const {
	std::string result = "";
	if(lastCaller.empty() == false) {
		for(unsigned int index = 0; index < lastCaller.size(); ++index) {
			result += lastCaller[index] + "|";
		}
	}
	return result;
}

void RandomGen::clearLastCaller() {
	if(lastCaller.empty() == false) {
		lastCaller.clear();
	}
}
void RandomGen::addLastCaller(std::string text) {
	if(disableLastCallerTracking == false) {
		lastCaller.push_back(text);
	}
}

int RandomGen::randRange(int min, int max,string lastCaller) {
	if(min > max) {
		char szBuf[8096]="";
		snprintf(szBuf,8096,"In [%s::%s Line: %d] min > max, min = %d, max = %d",__FILE__,__FUNCTION__,__LINE__,min,max);
		throw megaglest_runtime_error(szBuf);
	}

	int diff= max-min;
	float numerator = static_cast<float>(diff + 1) * static_cast<float>(this->rand(lastCaller));
	int res= min + static_cast<int>(truncateDecimal<float>(numerator / static_cast<float>(m),6));
	if(res < min || res > max) {
		char szBuf[8096]="";
		snprintf(szBuf,8096,"In [%s::%s Line: %d] res < min || res > max, min = %d, max = %d, res = %d",__FILE__,__FUNCTION__,__LINE__,min,max,res);
		throw megaglest_runtime_error(szBuf);
	}
	return res;
}

float RandomGen::randRange(float min, float max,string lastCaller) {
	if(min > max) {
		char szBuf[8096]="";
		snprintf(szBuf,8096,"In [%s::%s Line: %d] min > max, min = %f, max = %f",__FILE__,__FUNCTION__,__LINE__,min,max);
		throw megaglest_runtime_error(szBuf);
	}

	float rand01 = static_cast<float>(this->rand(lastCaller)) / (m-1);
	float res= min + (max - min) * rand01;
	res = truncateDecimal<float>(res,6);

	if(res < min || res > max) {
		char szBuf[8096]="";
		snprintf(szBuf,8096,"In [%s::%s Line: %d] res < min || res > max, min = %f, max = %f, res = %f",__FILE__,__FUNCTION__,__LINE__,min,max,res);
		throw megaglest_runtime_error(szBuf);
	}
	return res;
}

}}//end namespace