/*--------------------------------------------------------------------------------
ランダム・シャッフル・サロゲートデータを生成
generate Random Shuffle Surrogate (RSS) data
generate_RSS.c
*--------------------------------------------------------------------------------*/
#include "RSS.h"
static uint32_t random_below(uint32_t limit)
{
uint32_t r;
const uint32_t threshold = (uint32_t)(-limit) % limit;
do {
r = (uint32_t)genrand_int32();
} while (r < threshold);
return (r % limit);
}
int generate_RSS( int num, const double *data, double *RSS )
{
int i;
int j;
int k;
int r;
int *order;
if (num <= 0) {
fputs("# invalid data number\n", stderr);
return -1;
}
if (data == NULL || RSS == NULL) {
fputs("# data or RSS is NULL\n", stderr);
return -1;
}
/*--------------------------------------------------------------------------*/
order = malloc( (size_t)num * sizeof *order );
if ( order == NULL ) {
fputs( "# cannot allocate memory for order\n", stderr );
return -1;
}
/*--------------------------------------------------------------------------*/
for( i = 0; i < num; i++ ) {
order[i] = i;
}
j = num;
for( i = 0; i < num; i++ ){
r = (int)random_below( (uint32_t)j );
k = order[r];
order[r] = order[j-1];
j--;
RSS[i] = data[k];
// printf("%.10f\n", RSS[i]);
}
free( order );
return 0;
}