1 // Digit sequence level random number generator.
7 #include "cl_random_impl.h"
12 #include "cln/random.h"
18 void testrandom_UDS (random_state& randomstate, uintD* MSDptr, uintC len)
20 // Idea from Torbjörn Granlund, see his "random2.c" file in gmp 2.0.
21 var uintD* ptr = MSDptr mspop len;
22 DS_clear_loop(MSDptr,len,ptr);
23 var uintC bit_pos = 0;
25 var uintC ran_bits = 0;
26 while (bit_pos < intDsize*len)
27 { if (ran_bits < log2_intDsize+1)
28 { ran = random32(randomstate); ran_bits = 32; }
29 var uintL n_bits = (ran >> 1) % intDsize + 1; // number of bits
31 { // put in a bit string of n_bits bits at position bit_pos.
32 if (bit_pos + n_bits > intDsize*len)
33 { n_bits = intDsize*len - bit_pos; }
34 if (bit_pos / intDsize == (bit_pos + n_bits - 1) / intDsize)
35 { // need to modify one digit
36 lspref(ptr,bit_pos/intDsize) |= (((uintD)1 << n_bits) - 1) << (bit_pos%intDsize);
39 { // need to modify two adjacent digits
40 lspref(ptr,bit_pos/intDsize) |= ((uintD)(-1) << (bit_pos%intDsize));
41 lspref(ptr,bit_pos/intDsize+1) |= (((uintD)1 << ((bit_pos+n_bits)%intDsize)) - 1);
44 bit_pos = bit_pos + n_bits;
45 ran = ran >> (log2_intDsize+1); ran_bits -= log2_intDsize+1;