Steffen Nurpmeso wrote in <20220517220924.xohqc%stef...@sdaoden.eu>: |Joerg Sonnenberger wrote in | <yoqhj3yy9qrax...@bec.de>: ||Am Fri, May 13, 2022 at 09:43:26AM -0500 schrieb Luke Small: ||> I made a couple new versions of a new kind of arc4random_uniform-like ... |0 bytes "do not occur", so a 32-bit RNG value "is" >=0x01FFFFFF in |most cases for "my RNG" (of 100000 803/759/793 NOT; 776/805/793 |NOT for Linux getrandom(2)), which is a pretty high cut off. ...
/*@ lotto.cxx - output six random numbers */ #include <su/mem.h> #include <su/random.h> #include <sys/random.h> //#define NYDPROF_ENABLE //#define NYD_ENABLE //#define NYD2_ENABLE #include <su/code-in.h> NSPC_USE(su) static u32 bounded_rand(u32 range, u32 rv){ for(u32 t = -range % range;;){ if(rv >= t) return rv % range; log::write(log::emerg, "NOFIT"); } } int main(void){ u32 uni[50], mod[50], rv; state::create_core(NIL, (state::debug | log::debug), state::err_nopass); su_mem_set(uni, 0, sizeof uni); su_mem_set(mod, 0, sizeof mod); u32 au=0; for(u32 i = 0; i < 100000; ++i){ random::builtin_generate(&rv, sizeof rv, state::err_nopass); //if(getrandom(&rv, sizeof rv, GRND_NONBLOCK) == -1) // log::write(log::emerg, "getrandom(2)"); if(rv < 0x01FFFFFF) log::write(log::info, "AU %u - 0x%X", ++au,rv); ++mod[rv % NELEM(mod)]; ++uni[bounded_rand(NELEM(mod), rv)]; } u32 unilo, modlo, unihi, modhi; unilo = modlo = max::u32; unihi = modhi = 0; for(u32 i = 0; i < NELEM(uni); ++i){ unilo = get_min(unilo, uni[i]); modlo = get_min(modlo, mod[i]); unihi = get_max(unihi, uni[i]); modhi = get_max(modhi, mod[i]); log::write(log::info, "%u - %u / %u %s", i, uni[i], mod[i], (uni[i] != mod[i] ? "!!!" : "=")); } log::write(log::info, "MIN %u / %u, MAX %u / %u - au %u", unilo, modlo, unihi, modhi,au); return 0; } #include <su/code-ou.h> // s-it-mode --steffen | |Der Kragenbaer, The moon bear, |der holt sich munter he cheerfully and one by one |einen nach dem anderen runter wa.ks himself off |(By Robert Gernhardt)