CNL Stat : Random Number Generation : random_GFSR_table_get
random_GFSR_table_get
Retrieves the current table used in the GFSR generator.
Synopsis
#include <imsls.h>
void imsls_random_GFSR_table_get (int **table, ..., 0)
Required Arguments
int **table (Output)
Address of a pointer to an array of length 1565 containing the table used in the GFSR generators. Typically, int *table is declared and &table is used as an argument.
Synopsis with Optional Arguments
#include <imsls.h>
void imsls_random_GFSR_table_get (int **table,
IMSLS_RETURN_USER, int r[],
0)
Optional Arguments
IMSLS_RETURN_USER, int r[] (Output)
User-supplied array of length 1565 containing the table used in the GFSR generators.
Description
Function imsls_f_random_GFSR_table_get retrieves the current table used in the GFSR generator. A reason for doing this would be to restart a simulation, using function imsls_f_random_GFSR_table_set to reset the table. To restart a simulation using a GFSR generator, both the seed and the table must be reset (see example). The tables for the GFSR generators are separate for single and double precision, so, if precisions are mixed in a program, it is necessary to manage each precision separately for the GFSR generators.
Example
In this example, three separate simulation streams are used, each with a different form of the generator. Each stream is stopped and restarted. (Although this example is obviously an artificial one, there may be reasons for maintaining separate streams and stopping and restarting them because of the nature of the usage of the random numbers coming from the separate streams.)
 
#include <imsls.h>
#include <stdio.h>
 
int main()
{
float *r, *table;
int nr, iseed1, iseed2, iseed7;
int *itable;
 
nr = 5;
iseed1 = 123457;
iseed2 = 123457;
iseed7 = 123457;
 
/* Begin first stream, iopt = 1 (by default) */
imsls_random_seed_set (iseed1);
 
r = imsls_f_random_uniform (nr,
0);
 
iseed1 = imsls_random_seed_get ();
 
imsls_f_write_matrix ("First stream output", 1, 5, r,
IMSLS_NO_COL_LABELS,
IMSLS_NO_ROW_LABELS,
0);
 
printf(" Output seed\t%d\n\n", iseed1);
 
imsls_free(r);
 
/* Begin second stream, iopt = 2 */
imsls_random_option (2);
imsls_random_seed_set (iseed2);
 
r = imsls_f_random_uniform (nr,
0);
 
iseed2 = imsls_random_seed_get ();
 
imsls_f_random_table_get (&table,
0);
 
imsls_f_write_matrix ("Second stream output", 1, 5, r,
IMSLS_NO_COL_LABELS,
IMSLS_NO_ROW_LABELS,
0);
 
printf(" Output seed\t%d\n\n", iseed2);
 
imsls_free(r);
 
/* Begin third stream, iopt = 7 */
imsls_random_option (7);
imsls_random_seed_set (iseed7);
 
r = imsls_f_random_uniform (nr,
0);
 
iseed7 = imsls_random_seed_get ();
 
imsls_random_GFSR_table_get (&itable,
0);
 
imsls_f_write_matrix ("Third stream output", 1, 5, r,
IMSLS_NO_COL_LABELS,
IMSLS_NO_ROW_LABELS,
0);
 
printf(" Output seed\t%d\n\n", iseed7);
 
imsls_free(r);
 
/* Reinitialize seed and resume first stream */
imsls_random_option (1);
imsls_random_seed_set (iseed1);
 
r = imsls_f_random_uniform (nr,
0);
 
iseed1 = imsls_random_seed_get ();
 
imsls_f_write_matrix ("First stream output", 1, 5, r,
IMSLS_NO_COL_LABELS,
IMSLS_NO_ROW_LABELS,
0);
 
printf(" Output seed\t%d\n\n", iseed1);
 
imsls_free(r);
 
/* Reinitialize seed and table for shuffling and resume second
* stream */
imsls_random_option (2);
imsls_random_seed_set (iseed2);
imsls_f_random_table_set (table);
 
r = imsls_f_random_uniform (nr,
0);
 
iseed2 = imsls_random_seed_get ();
 
imsls_f_write_matrix ("Second stream output", 1, 5, r,
IMSLS_NO_COL_LABELS,
IMSLS_NO_ROW_LABELS,
0);
 
printf(" Output seed\t%d\n\n", iseed2);
 
imsls_free(r);
 
/* Reinitialize seed and table for GFSR and resume third stream. */
imsls_random_option (7);
imsls_random_seed_set (iseed7);
imsls_random_GFSR_table_set (itable);
 
r = imsls_f_random_uniform (nr,
0);
 
iseed7 = imsls_random_seed_get ();
 
imsls_f_write_matrix ("Third stream output", 1, 5, r,
IMSLS_NO_COL_LABELS,
IMSLS_NO_ROW_LABELS,
0);
 
printf(" Output seed\t%d\n\n", iseed7);
 
imsls_free(r);
}
Output
 
First stream output
0.9662 0.2607 0.7663 0.5693 0.8448
Output seed 1814256879
 
 
Second stream output
0.7095 0.1861 0.4794 0.6038 0.3790
Output seed 1965912801
 
 
Third stream output
0.3914 0.0263 0.7622 0.0281 0.8997
Output seed 1932158269
 
 
First stream output
0.0443 0.9872 0.6014 0.8964 0.3809
Output seed 817878095
 
 
Second stream output
0.2557 0.4788 0.2258 0.3455 0.5811
Output seed 2108806573
 
 
Third stream output
0.7519 0.5084 0.9070 0.0910 0.6917
Output seed 1485334679