Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/stdlib.hfa

    r1959528 raa0a1ad  
    1010// Created On       : Thu Jan 28 17:12:35 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Jan 12 09:09:48 2022
    13 // Update Count     : 620
     12// Last Modified On : Sun Jan  2 22:53:57 2022
     13// Update Count     : 594
    1414//
    1515
     
    2121#include <stdlib.h>                                                                             // *alloc, strto*, ato*
    2222#include <heap.hfa>
    23 
    2423
    2524// Reduce includes by explicitly defining these routines.
     
    386385//---------------------------------------
    387386
    388 // Sequential Pseudo Random-Number Generator : generate repeatable sequence of values that appear random.
    389 //
    390 // Declaration :
    391 //   PRNG sprng = { 1009 } - set starting seed versus random seed
    392 //   
    393 // Interface :
    394 //   set_seed( sprng, 1009 ) - set starting seed for ALL kernel threads versus random seed
    395 //   get_seed( sprng ) - read seed
    396 //   prng( sprng ) - generate random value in range [0,UINT_MAX]
    397 //   prng( sprng, u ) - generate random value in range [0,u)
    398 //   prng( sprng, l, u ) - generate random value in range [l,u]
    399 //   calls( sprng ) - number of generated random value so far
    400 //
    401 // Examples : generate random number between 5-21
    402 //   prng( sprng ) % 17 + 5;    values 0-16 + 5 = 5-21
    403 //   prng( sprng, 16 + 1 ) + 5;
    404 //   prng( sprng, 5, 21 );
    405 //   calls( sprng );
    406 
    407387struct PRNG {
    408388        uint32_t callcnt;                                                                       // call count
     
    411391}; // PRNG
    412392
    413 void set_seed( PRNG & prng, uint32_t seed_ );
    414 uint32_t prng( PRNG & prng ) __attribute__(( warn_unused_result )); // [0,UINT_MAX]
     393extern uint32_t prng( PRNG & prng ) __attribute__(( warn_unused_result )); // [0,UINT_MAX]
    415394static inline {
     395        void set_seed( PRNG & prng, uint32_t seed_ ) with( prng ) { state = seed = seed_; } // set seed
    416396        void ?{}( PRNG & prng ) { set_seed( prng, rdtscl() ); } // random seed
    417397        void ?{}( PRNG & prng, uint32_t seed ) { set_seed( prng, seed ); } // fixed seed
     
    422402} // distribution
    423403
    424 // Concurrent Pseudo Random-Number Generator : generate repeatable sequence of values that appear random.
    425 //
    426 // Interface :
    427 //   set_seed( 1009 ) - fixed seed for all kernel threads versus random seed
    428 //   get_seed() - read seed
    429 //   prng() - generate random value in range [0,UINT_MAX]
    430 //   prng( u ) - generate random value in range [0,u)
    431 //   prng( l, u ) - generate random value in range [l,u]
    432 //
    433 // Examples : generate random number between 5-21
    434 //   prng() % 17 + 5;   values 0-16 + 5 = 5-21
    435 //   prng( 16 + 1 ) + 5;
    436 //   prng( 5, 21 );
    437 
    438 void set_seed( uint32_t seed_ ) OPTIONAL_THREAD;
    439 uint32_t get_seed() __attribute__(( warn_unused_result )) OPTIONAL_THREAD;
    440 uint32_t prng( void ) __attribute__(( warn_unused_result )) OPTIONAL_THREAD; // [0,UINT_MAX]
     404extern void set_seed( uint32_t seed );                                  // set per thread seed
     405extern uint32_t get_seed();                                                             // get seed
     406extern uint32_t prng( void ) __attribute__(( warn_unused_result )); // [0,UINT_MAX]
    441407static inline {
    442         uint32_t prng( uint32_t u ) __attribute__(( warn_unused_result )) { return prng() % u; } // [0,u)
    443         uint32_t prng( uint32_t l, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( u - l + 1 ) + l; } // [l,u]
     408        uint32_t prng( uint32_t u ) __attribute__(( warn_unused_result ));
     409        uint32_t prng( uint32_t u ) { return prng() % u; }      // [0,u)
     410        uint32_t prng( uint32_t l, uint32_t u ) __attribute__(( warn_unused_result ));
     411        uint32_t prng( uint32_t l, uint32_t u ) { return prng( u - l + 1 ) + l; } // [l,u]
    444412} // distribution
    445413
Note: See TracChangeset for help on using the changeset viewer.