# include # include # include # include # include "asa183.h" int main ( ); void test01 ( ); void test02 ( ); void test03 ( ); void test04 ( ); void test05 ( ); void test06 ( ); void test07 ( ); void test08 ( ); void test09 ( ); void test10 ( ); void test11 ( ); void test12 ( ); void timestamp ( ); /******************************************************************************/ int main ( ) /******************************************************************************/ /* Purpose: asa183_test() tests asa183(). Licensing: This code is distributed under the MIT license. Modified: 08 July 2008 Author: John Burkardt */ { timestamp ( ); printf ( "\n" ); printf ( "asa183_test():\n" ); printf ( " C version\n" ); printf ( " test asa183().\n" ); test01 ( ); test02 ( ); test03 ( ); test04 ( ); test05 ( ); test06 ( ); test07 ( ); test08 ( ); test09 ( ); test10 ( ); test11 ( ); test12 ( ); /* Terminate. */ printf ( "\n" ); printf ( "asa183_test():\n" ); printf ( " Normal end of execution.\n" ); printf ( "\n" ); timestamp ( ); return 0; } /******************************************************************************/ void test01 ( ) /******************************************************************************/ /* Purpose: test01() tests r4_random(). Licensing: This code is distributed under the MIT license. Modified: 08 July 2008 Author: John Burkardt */ { int i; float r; int s1; int s2; int s3; printf ( "\n" ); printf ( "test01():\n" ); printf ( " r4_random() computes pseudorandom values.\n" ); printf ( " Three seeds, S1, S2, and S3, are used.\n" ); s1 = 12345; s2 = 34567; s3 = 56789; printf ( "\n" ); printf ( " R S1 S2 S3\n" ); printf ( "\n" ); printf ( " %8d %8d %8d\n", s1, s2, s3 ); for ( i = 0; i < 10; i++ ) { r = r4_random ( &s1, &s2, &s3 ); printf ( " %14f %8d %8d %8d\n", r, s1, s2, s3 ); } return; } /******************************************************************************/ void test02 ( ) /******************************************************************************/ /* Purpose: test02() tests r4_random(). Licensing: This code is distributed under the MIT license. Modified: 08 July 2008 Author: John Burkardt */ { int i; int n = 100000; int s1; int s2; int s3; float *u; float u_avg; float u_var; u = ( float * ) malloc ( n * sizeof ( float ) ); printf ( "\n" ); printf ( "test02():\n" ); printf ( " Examine the average and variance of a\n" ); printf ( " sequence generated by r4_random().\n" ); /* Start with known seeds. */ s1 = 12345; s2 = 34567; s3 = 56789; printf ( "\n" ); printf ( " Now compute %d elements.\n", n ); u_avg = 0.0; for ( i = 0; i < n; i++ ) { u[i] = r4_random ( &s1, &s2, &s3 ); u_avg = u_avg + u[i]; } u_avg = u_avg / ( float ) ( n ); u_var = 0.0; for ( i = 0; i < n; i++ ) { u_var = u_var + ( u[i] - u_avg ) * ( u[i] - u_avg ); } u_var = u_var / ( float ) ( n - 1 ); printf ( "\n" ); printf ( " Average value = %f\n", u_avg ); printf ( " Expecting %f\n", 0.5 );; printf ( "\n" ); printf ( " Variance = %f\n", u_var ); printf ( " Expecting %f\n", 1.0 / 12.0 ); free ( u ); return; } /******************************************************************************/ void test03 ( ) /******************************************************************************/ /* Purpose: test03() tests r4_random(). Licensing: This code is distributed under the MIT license. Modified: 08 July 2008 Author: John Burkardt */ { int i; float r; int s1; int s1_save; int s2; int s2_save; int s3; int s3_save; printf ( "\n" ); printf ( "test03():\n" ); printf ( " Show how the seeds used by r4_random(),\n" ); printf ( " which change on each step, can be reset to\n" ); printf ( " restore any part of the sequence.\n" ); s1_save = 12345; s2_save = 34567; s3_save = 56789; s1 = s1_save; s2 = s2_save; s3 = s3_save; printf ( "\n" ); printf ( " Begin sequence with following seeds\n" ); printf ( "\n" ); printf ( " S1 = %d\n", s1 ); printf ( " S2 = %d\n", s2 ); printf ( " S3 = %d\n", s3 ); printf ( "\n" ); printf ( " I R S1 S2 S3\n" ); printf ( "\n" ); for ( i = 1; i <= 10; i++ ) { r = r4_random ( &s1, &s2, &s3 ); printf ( " %8d %14f %12d %12d %12d\n", i, r, s1, s2, s3 ); if ( i == 5 ) { s1_save = s1; s2_save = s2; s3_save = s3; } } s1 = s1_save; s2 = s2_save; s3 = s3_save; printf ( "\n" ); printf ( " Restart the sequence, using the seeds\n" ); printf ( " produced after step 5:\n" ); printf ( "\n" ); printf ( " S1 = %d\n", s1 ); printf ( " S2 = %d\n", s2 ); printf ( " S3 = %d\n", s3 ); printf ( "\n" ); printf ( " I R S1 S2 S3\n" ); printf ( "\n" ); for ( i = 1; i <= 10; i++ ) { r = r4_random ( &s1, &s2, &s3 ); printf ( " %8d %14f %12d %12d %12d\n", i, r, s1, s2, s3 ); } return; } /******************************************************************************/ void test04 ( ) /******************************************************************************/ /* Purpose: test04() tests r4_uni(). Licensing: This code is distributed under the MIT license. Modified: 08 July 2008 Author: John Burkardt */ { int i; float r; int s1; int s2; printf ( "\n" ); printf ( "test04():\n" ); printf ( " r4_uni() computes pseudorandom values.\n" ); printf ( " Two seeds, S1 and S2, are used.\n" ); s1 = 12345; s2 = 34567; printf ( "\n" ); printf ( " R S1 S2\n" ); printf ( "\n" ); printf ( " %12d %12d\n", s1, s2 ); for ( i = 0; i < 10; i++ ) { r = r4_uni ( &s1, &s2 ); printf ( " %14f %12d %12d\n", r, s1, s2 ); } return; } /******************************************************************************/ void test05 ( ) /******************************************************************************/ /* Purpose: test05 tests r4_uni(). Licensing: This code is distributed under the MIT license. Modified: 08 July 2008 Author: John Burkardt */ { int i; int n = 100000; int s1; int s2; float *u; float u_avg; float u_var; u = ( float * ) malloc ( n * sizeof ( float ) ); printf ( "\n" ); printf ( "test05():\n" ); printf ( " Examine the average and variance of a\n" ); printf ( " sequence generated by r4_uni().\n" ); /* Start with known seeds. */ s1 = 12345; s2 = 34567; printf ( "\n" ); printf ( " Now compute %d elements.\n", n ); u_avg = 0.0; for ( i = 0; i < n; i++ ) { u[i] = r4_uni ( &s1, &s2 ); u_avg = u_avg + u[i]; } u_avg = u_avg / ( float ) ( n ); u_var = 0.0; for ( i = 0; i < n; i++ ) { u_var = u_var + ( u[i] - u_avg ) * ( u[i] - u_avg ); } u_var = u_var / ( float ) ( n - 1 ); printf ( "\n" ); printf ( " Average value = %f\n", u_avg ); printf ( " Expecting %f\n", 0.5 );; printf ( "\n" ); printf ( " Variance = %f\n", u_var ); printf ( " Expecting %f\n", 1.0 / 12.0 ); free ( u ); return; } /******************************************************************************/ void test06 ( ) /******************************************************************************/ /* Purpose: test06() tests r4_uni(). Licensing: This code is distributed under the MIT license. Modified: 08 July 2008 Author: John Burkardt */ { int i; float r; int s1; int s1_save; int s2; int s2_save; printf ( "\n" ); printf ( "test06():\n" ); printf ( " Show how the seeds used by r4_uni(),\n" ); printf ( " which change on each step, can be reset to\n" ); printf ( " restore any part of the sequence.\n" ); s1_save = 12345; s2_save = 34567; s1 = s1_save; s2 = s2_save; printf ( "\n" ); printf ( " Begin sequence with following seeds\n" ); printf ( "\n" ); printf ( " S1 = %d\n", s1 ); printf ( " S2 = %d\n", s2 ); printf ( "\n" ); printf ( " I R S1 S2\n" ); printf ( "\n" ); for ( i = 1; i <= 10; i++ ) { r = r4_uni ( &s1, &s2 ); printf ( " %8d %14f %12d %12d\n", i, r, s1, s2 ); if ( i == 5 ) { s1_save = s1; s2_save = s2; } } s1 = s1_save; s2 = s2_save; printf ( "\n" ); printf ( " Restart the sequence, using the seeds\n" ); printf ( " produced after step 5:\n" ); printf ( "\n" ); printf ( " S1 = %d\n", s1 ); printf ( " S2 = %d\n", s2 ); printf ( "\n" ); printf ( " I R S1 S2\n" ); printf ( "\n" ); for ( i = 1; i <= 10; i++ ) { r = r4_uni ( &s1, &s2 ); printf ( " %8d %14f %12d %12d\n", i, r, s1, s2 ); } return; } /******************************************************************************/ void test07 ( ) /******************************************************************************/ /* Purpose: test07() tests r8_random(). Licensing: This code is distributed under the MIT license. Modified: 08 July 2008 Author: John Burkardt */ { int i; double r; int s1; int s2; int s3; printf ( "\n" ); printf ( "test07():\n" ); printf ( " r8_random() computes pseudorandom values.\n" ); printf ( " Three seeds, S1, S2, and S3, are used.\n" ); s1 = 12345; s2 = 34567; s3 = 56789; printf ( "\n" ); printf ( " R S1 S2 S3\n" ); printf ( "\n" ); printf ( " %8d %8d %8d\n", s1, s2, s3 ); for ( i = 0; i < 10; i++ ) { r = r8_random ( &s1, &s2, &s3 ); printf ( " %14f %8d %8d %8d\n", r, s1, s2, s3 ); } return; } /******************************************************************************/ void test08 ( ) /******************************************************************************/ /* Purpose: test08() tests r8_random(). Licensing: This code is distributed under the MIT license. Modified: 08 July 2008 Author: John Burkardt */ { int i; int n = 100000; int s1; int s2; int s3; double *u; double u_avg; double u_var; u = ( double * ) malloc ( n * sizeof ( double ) ); printf ( "\n" ); printf ( "test08():\n" ); printf ( " Examine the average and variance of a\n" ); printf ( " sequence generated by r8_random().\n" ); /* Start with known seeds. */ s1 = 12345; s2 = 34567; s3 = 56789; printf ( "\n" ); printf ( " Now compute %d elements.\n", n ); u_avg = 0.0; for ( i = 0; i < n; i++ ) { u[i] = r8_random ( &s1, &s2, &s3 ); u_avg = u_avg + u[i]; } u_avg = u_avg / ( double ) ( n ); u_var = 0.0; for ( i = 0; i < n; i++ ) { u_var = u_var + ( u[i] - u_avg ) * ( u[i] - u_avg ); } u_var = u_var / ( double ) ( n - 1 ); printf ( "\n" ); printf ( " Average value = %f\n", u_avg ); printf ( " Expecting %f\n", 0.5 ); printf ( "\n" ); printf ( " Variance = %f\n", u_var ); printf ( " Expecting %f\n", 1.0 / 12.0 ); free ( u ); return; } /******************************************************************************/ void test09 ( ) /******************************************************************************/ /* Purpose: test09() tests r8_random(). Licensing: This code is distributed under the MIT license. Modified: 08 July 2008 Author: John Burkardt */ { int i; double r; int s1; int s1_save; int s2; int s2_save; int s3; int s3_save; printf ( "\n" ); printf ( "test09():\n" ); printf ( " Show how the seeds used by r8_random(),\n" ); printf ( " which change on each step, can be reset to\n" ); printf ( " restore any part of the sequence.\n" ); s1_save = 12345; s2_save = 34567; s3_save = 56789; s1 = s1_save; s2 = s2_save; s3 = s3_save; printf ( "\n" ); printf ( " Begin sequence with following seeds\n" ); printf ( "\n" ); printf ( " S1 = %d\n", s1 ); printf ( " S2 = %d\n", s2 ); printf ( " S3 = %d\n", s3 ); printf ( "\n" ); printf ( " I R S1 S2 S3\n" ); printf ( "\n" ); for ( i = 1; i <= 10; i++ ) { r = r8_random ( &s1, &s2, &s3 ); printf ( " %8d %14f %12d %12d %12d\n", i, r, s1, s2, s3 ); if ( i == 5 ) { s1_save = s1; s2_save = s2; s3_save = s3; } } s1 = s1_save; s2 = s2_save; s3 = s3_save; printf ( "\n" ); printf ( " Restart the sequence, using the seeds\n" ); printf ( " produced after step 5:\n" ); printf ( "\n" ); printf ( " S1 = %d\n", s1 ); printf ( " S2 = %d\n", s2 ); printf ( " S3 = %d\n", s3 ); printf ( "\n" ); printf ( " I R S1 S2 S3\n" ); printf ( "\n" ); for ( i = 1; i <= 10; i++ ) { r = r8_random ( &s1, &s2, &s3 ); printf ( " %8d %14f %12d %12d %12d\n", i, r, s1, s2, s3 ); } return; } /******************************************************************************/ void test10 ( ) /******************************************************************************/ /* Purpose: test10 tests r8_uni(). Licensing: This code is distributed under the MIT license. Modified: 08 July 2008 Author: John Burkardt */ { int i; double r; int s1; int s2; printf ( "\n" ); printf ( "test10():\n" ); printf ( " r8_uni() computes pseudorandom values.\n" ); printf ( " Two seeds, S1 and S2, are used.\n" ); s1 = 12345; s2 = 34567; printf ( "\n" ); printf ( " R S1 S2\n" ); printf ( "\n" ); printf ( " %12d %12d\n", s1, s2 ); for ( i = 0; i < 10; i++ ) { r = r8_uni ( &s1, &s2 ); printf ( " %14f %12d %12d\n", r, s1, s2 ); } return; } /******************************************************************************/ void test11 ( ) /******************************************************************************/ /* Purpose: test11() tests r8_uni(). Licensing: This code is distributed under the MIT license. Modified: 08 July 2008 Author: John Burkardt */ { int i; int n = 100000; int s1; int s2; double *u; double u_avg; double u_var; u = ( double * ) malloc ( n * sizeof ( double ) ); printf ( "\n" ); printf ( "test11():\n" ); printf ( " Examine the average and variance of a\n" ); printf ( " sequence generated by r8_uni().\n" ); /* Start with known seeds. */ s1 = 12345; s2 = 34567; printf ( "\n" ); printf ( " Now compute %d elements.\n", n ); u_avg = 0.0; for ( i = 0; i < n; i++ ) { u[i] = r8_uni ( &s1, &s2 ); u_avg = u_avg + u[i]; } u_avg = u_avg / ( float ) ( n ); u_var = 0.0; for ( i = 0; i < n; i++ ) { u_var = u_var + ( u[i] - u_avg ) * ( u[i] - u_avg ); } u_var = u_var / ( float ) ( n - 1 ); printf ( "\n" ); printf ( " Average value = %f\n", u_avg ); printf ( " Expecting %f\n", 0.5 );; printf ( "\n" ); printf ( " Variance = %f\n", u_var ); printf ( " Expecting %f\n", 1.0 / 12.0 ); free ( u ); return; } /******************************************************************************/ void test12 ( ) /******************************************************************************/ /* Purpose: test12() tests r8_uni(). Licensing: This code is distributed under the MIT license. Modified: 08 July 2008 Author: John Burkardt */ { int i; double r; int s1; int s1_save; int s2; int s2_save; printf ( "\n" ); printf ( "test12():\n" ); printf ( " Show how the seeds used by r8_uni(),\n" ); printf ( " which change on each step, can be reset to\n" ); printf ( " restore any part of the sequence.\n" ); s1_save = 12345; s2_save = 34567; s1 = s1_save; s2 = s2_save; printf ( "\n" ); printf ( " Begin sequence with following seeds\n" ); printf ( "\n" ); printf ( " S1 = %d\n", s1 ); printf ( " S2 = %d\n", s2 ); printf ( "\n" ); printf ( " I R S1 S2\n" ); printf ( "\n" ); for ( i = 1; i <= 10; i++ ) { r = r8_uni ( &s1, &s2 ); printf ( " %8d %14f %12d %12d\n", i, r, s1, s2 ); if ( i == 5 ) { s1_save = s1; s2_save = s2; } } s1 = s1_save; s2 = s2_save; printf ( "\n" ); printf ( " Restart the sequence, using the seeds\n" ); printf ( " produced after step 5:\n" ); printf ( "\n" ); printf ( " S1 = %d\n", s1 ); printf ( " S2 = %d\n", s2 ); printf ( "\n" ); printf ( " I R S1 S2\n" ); printf ( "\n" ); for ( i = 1; i <= 10; i++ ) { r = r8_uni ( &s1, &s2 ); printf ( " %8d %14f %12d %12d\n", i, r, s1, s2 ); } return; } /******************************************************************************/ void timestamp ( ) /******************************************************************************/ /* Purpose: timestamp() prints the current YMDHMS date as a time stamp. Example: 17 June 2014 09:45:54 AM Licensing: This code is distributed under the MIT license. Modified: 17 June 2014 Author: John Burkardt */ { # define TIME_SIZE 40 static char time_buffer[TIME_SIZE]; const struct tm *tm; time_t now; now = time ( NULL ); tm = localtime ( &now ); strftime ( time_buffer, TIME_SIZE, "%d %B %Y %I:%M:%S %p", tm ); printf ( "%s\n", time_buffer ); return; # undef TIME_SIZE }