#include "../include/tscope.h"
#include "../include/tscope/internal.h"
void ts_rseed(int userseed[3])
{
_rndseed[0] = userseed[0];
_rndseed[1] = userseed[1];
_rndseed[2] = userseed[2];
if (_debug_flag > DEBUG3)
fprintf(stderr, "User defined random seeds: %d, %d and %d.\n",
_rndseed[0], _rndseed[1], _rndseed[2]);
if (!_random_flag) {
atexit(_random_exit);
_random_flag = 1;
}
}
void ts_rseedfile(char *file)
{
FILE *seedfile;
if ((seedfile = fopen(file, "r")) == NULL)
ts_fatal("ts_rseedfile: error reading seed file.");
else {
fscanf(seedfile, "%d", &_rndseed[0]);
fscanf(seedfile, "%d", &_rndseed[1]);
fscanf(seedfile, "%d", &_rndseed[2]);
fclose(seedfile);
if (_debug_flag > DEBUG3)
fprintf(stderr, "Random seeds from file %s: %d, %d and %d.\n",
file, _rndseed[0], _rndseed[1], _rndseed[2]);
}
if (!_random_flag) {
atexit(_random_exit);
_random_flag = 1;
}
}
double ts_runif()
{
double ran;
if (!_random_flag)
_random_init();
_rndseed[0] = 171 * (_rndseed[0] % 177) - 2 * (_rndseed[0] / 177);
_rndseed[1] = 172 * (_rndseed[1] % 176) - 35 * (_rndseed[1] / 176);
_rndseed[2] = 170 * (_rndseed[2] % 178) - 63 * (_rndseed[2] / 178);
if (_rndseed[0] < 0)
_rndseed[0] = _rndseed[0] + 30269;
if (_rndseed[1] < 0)
_rndseed[1] = _rndseed[1] + 30307;
if (_rndseed[2] < 0)
_rndseed[2] = _rndseed[2] + 30323;
ran = ((float) _rndseed[0] / 30269
+ (float) _rndseed[1] / 30307 + (float) _rndseed[2] / 30323);
ran = ran - (int) ran;
if (ran <= 0)
ran = 1e-30;
if (ran >= 1)
ran = 0.9999999999;
return ran;
}
double ts_rexp()
{
return -log(ts_runif());
}
double ts_rnorm(double mean, double sd)
{
double u1, u2, a, z;
u1 = ts_runif();
if (u1 > 0.5)
u2 = 1 - u1;
else
u2 = u1;
if (u2 < 1e-20)
z = 10;
else {
a = sqrt(-2 * log(u2));
z = a - ((7.45551 * a + 450.636) * a + 1271.059)
/ (((a + 110.4212) * a + 750.365) * a + 500.756);
}
if (u1 > 0.5)
z = -z;
if (sd < 0)
sd = -sd;
return mean + (z * sd);
}
int ts_rint(int nmax)
{
return (int) (ts_runif() * nmax);
}
int ts_rlist(int nmax, int freq, int *list)
{
int i;
int rnd, tmp;
for (i = 0; i < nmax * freq; i++)
list[i] = i / freq;
for (i = (nmax * freq) - 1; i > 0; i--) {
rnd = ts_rint(i + 1);
tmp = list[i];
list[i] = list[rnd];
list[rnd] = tmp;
}
return 1;
}
int ts_rslist(int nmax, int freq, int *list)
{
int i, j, tmp;
int digit_counter[nmax];
int prev_counter[nmax][nmax];
int total = (nmax * nmax * freq) + 1;
int possible = 0;
for (i = 0; i < nmax; i++) {
digit_counter[i] = 0;
for (j = 0; j < nmax; j++)
prev_counter[i][j] = 0;
}
list[0] = ts_rint(nmax);
digit_counter[list[0]]++;
for (i = 1; i < total - 1; i++) {
tmp = ts_rint(nmax);
if (digit_counter[tmp] >= nmax * freq) {
i--;
continue;
}
if (prev_counter[tmp][list[i - 1]] >= freq) {
i--;
continue;
}
list[i] = tmp;
digit_counter[tmp]++;
prev_counter[tmp][list[i - 1]]++;
if (i < total - 2)
{
possible = 0;
for (j = 0; j < nmax; j++) {
if (j == tmp)
continue;
if (digit_counter[j] < nmax * freq)
if (prev_counter[j][tmp] < freq)
possible = 1;
}
}
if (possible == 0)
break;
}
list[total - 1] = list[0];
if (possible == 0)
ts_rslist(nmax, freq, list);
return 1;
}