How to generate a random number from system clock as seed

drug007 drug2004 at bk.ru
Sun Jun 9 23:31:47 UTC 2024


On 09.06.2024 16:37, Eric P626 wrote:
> On Saturday, 8 June 2024 at 18:25:20 UTC, drug007 wrote:
>>
>> ~~~
>>     {
>>         const seed = castFrom!long.to!uint(Clock.currStdTime);
>>         auto rng = Random(seed);
>>         auto result = generate!(() => uniform(0, 10, rng))().take(7);
>>     // new random numbers sequence every time
>>         result.writeln;
>>     }
>> }
>> ~~~
> 
> I managed to use this piece of code and it worked.
> 
> ~~~
> uint seed = castFrom!long.to!uint(Clock.currStdTime);
> auto rng = Random(seed);
> ~~~
> 
> I am not exactly sure what the exclamation points stand for in the first 
> line of code. Probably, defining a type to class ```castFrom``` and 
> function ```to```. But I get the idea that it just cast long to uint 
> since ```Random``` requires an unsigned int >
> I assume from this line of code that C casting like ```(uint)varname``` 
> would not work.
> 
> 


`CastFrom!long` is a template instantiation. The instantiated template 
converts from `long` to `uint`. It is useful in meta-programming but 
here you can safely use other forms like c style cast:
```d
     const seed = cast(uint) Clock.currStdTime;
```
or
```
     const seed = to!uint(Clock.currStdTime & 0xFFFF);
```
here we need to use the `0xFFFF` mask, because `to!uint` throws a 
conversion positive overflow when the value of `Clock.currStdTime` 
exceeds the value of `uint.max`. But I don't like this variant and I 
don't recommend it.



More information about the Digitalmars-d-learn mailing list