generating random numbers

Andy Balba pwplus7 at gmail.com
Thu Aug 13 21:08:38 UTC 2020


On Monday, 10 August 2020 at 15:43:04 UTC, Andy Balba wrote:
> On Monday, 10 August 2020 at 15:13:51 UTC, bachmeier wrote:
>> On Monday, 10 August 2020 at 14:20:23 UTC, bachmeier wrote:
>>> On Monday, 10 August 2020 at 05:51:07 UTC, Andy Balba wrote:
>>>> generating random numbers using 
>>>> https://dlang.org/library/std/random/uniform01.html
>>>>
>>>> I find the example given in this section totally 
>>>> incomprehensible
>>>> .. Can any help me answer two simple questions:
>>>> How to generate a random floating number in range [0,1) ?
>>>> How to set a seed value, prior to generating random values ?
>>>
>>> Strange example for sure. I'd recommend checking out the 
>>> examples on the landing page for std.random: 
>>> https://dlang.org/library/std/random.html
>>
>> I created a PR with a hopefully clearer example:
>> https://github.com/dlang/phobos/pull/7588
>
> Ahhh yes, yes .. this is the way to write Dlang example code :
> https://dlang.org/library/std/random.html


... a very neat random byte generator is at
  https://github.com/LightBender/SecureD/tree/master/source/secured

here's the essential code :

import std.digest;
import std.stdio;
import std.exception;

@trusted ubyte[] random (uint bytes)
{
   if (bytes == 0)
      { printf("number of bytes must be > zero"); return null; }

   ubyte[] buffer = new ubyte[bytes];

   try
   { File urandom = File("/dev/urandom", "rb");
     urandom.setvbuf (null, _IONBF);
     scope(exit) urandom.close();

     try
       { buffer= urandom.rawRead(buffer); }

     catch(ErrnoException ex)
       { printf("Cant get next random bytes"); return null;}
     catch(Exception ex)
       { printf("Cant get next random bytes"); return null; }
   }

   catch(ErrnoException ex)
     { printf("Cant initialize system RNG"); return null; }
   catch(Exception ex)
     { printf ("Cant initialize system RNG"); return null; }

return buffer;
}

void main()
{
   ubyte[] rnd1 = random(32);
   writeln("32Bytes: ", toHexString!(LetterCase.lower)(rnd1));

   ubyte[] rnd2 = random(128);
   writeln("128Bytes: ", toHexString!(LetterCase.lower)(rnd2));

   ubyte[] rnd3 = random(512);
   writeln("512Bytes:"); 
writeln(toHexString!(LetterCase.lower)(rnd3));

   ubyte[] rnd4 = random(2048);
   writeln("2048 Bytes:"); 
writeln(toHexString!(LetterCase.lower)(rnd4));

}


More information about the Digitalmars-d-learn mailing list