View mode: basic / threaded / horizontal-split · Log in · Help
August 04, 2012
Random Numbers
Gotchas!

The module std.random documentation doesn't work as per the 
examples.
The example shows getting a random number by the following code 
does not work:

<code>
    // Generate a uniformly-distributed integer in the range [0, 
14]
    auto i = uniform(0, 15);
    // Generate a uniformly-distributed real in the range [0, 100)
    // using a specific random generator
    Random gen;
    auto r = uniform(0.0L, 100.0L, gen);
</code>

<code>
    // Gets a random number
    int get_random() {
        auto rng = new Random(unpredictableSeed);
        auto rn = uniform(0, m_files.length, rng);
        return rn;
    }
</code>

The new keyword was not in the example, and the original example 
code would not work.  When looking at the source code of the std 
libraries, a struct can contain a constructor, so therefore it is 
similar to a class; and on a whim I tried the new keyword.  So I 
thought I would pass this information along.  I looked at other 
posts in the forum, but didn't see anyone using the new keyword.  
Is this a bug, or a change to the D language implementation?
August 04, 2012
Re: Random Numbers
On Sat, Aug 4, 2012 at 6:40 PM, Ralph Main <rmain1972@live.com> wrote:

Hello Ralph,

> The module std.random documentation doesn't work as per the examples.
> The example shows getting a random number by the following code does not
> work:
(snip)

Both code samples you gave work perfectly for me (DMD 2.060, Linux).
Which version are you using?

> The new keyword was not in the example, and the original example code would
> not work.  When looking at the source code of the std libraries, a struct
> can contain a constructor, so therefore it is similar to a class; and on a
> whim I tried the new keyword.  So I thought I would pass this information
> along.  I looked at other posts in the forum, but didn't see anyone using
> the new keyword.  Is this a bug, or a change to the D language
> implementation?

The 'new' keyword has been in D from the beginning, but it's used to
create classes (which are reference types in D) or values on the heap.
Most of the time, you create a struct like this:

MyStruct s = MyStruct(arguments);

For a class:

MyClass c = new MyClass(arguments);

See: http://dlang.org/expression.html#NewExpression
August 04, 2012
Re: Random Numbers
Ralph Main:

> The module std.random documentation doesn't work as per the 
> examples.
> The example shows getting a random number by the following code 
> does not work:
>
> <code>
>     // Generate a uniformly-distributed integer in the range 
> [0, 14]
>     auto i = uniform(0, 15);
>     // Generate a uniformly-distributed real in the range [0, 
> 100)
>     // using a specific random generator
>     Random gen;
>     auto r = uniform(0.0L, 100.0L, gen);
> </code>
>
> <code>
>     // Gets a random number
>     int get_random() {
>         auto rng = new Random(unpredictableSeed);
>         auto rn = uniform(0, m_files.length, rng);
>         return rn;
>     }
> </code>

This code works, but it's a bad idea to create a new generator 
inside getRandom():


import std.stdio, std.random;

// Gets a random number, badly
int getRandom(int m) {
    auto rng = new Random(unpredictableSeed);
    return uniform(0, m, rng);
}

void main() {
    // Generate a uniformly-distributed integer in the range [0, 
14]
    auto i = uniform(0, 15);

    // Generate a uniformly-distributed real in the range [0, 100)
    // using a specific random generator
    Random gen;
    auto r = uniform(0.0L, 100.0L, gen);

    writeln(r);
    writeln(getRandom(10));
}


> The new keyword was not in the example, and the original 
> example code would not work.  When looking at the source code 
> of the std libraries, a struct can contain a constructor, so 
> therefore it is similar to a class; and on a whim I tried the 
> new keyword.  So I thought I would pass this information along.
>  I looked at other posts in the forum, but didn't see anyone 
> using the new keyword.  Is this a bug, or a change to the D 
> language implementation?

In D you instantiate a class with new, it generally gets 
allocated on the heap, and what you obtain is a class reference, 
that is a kind of pointer.

Structs can be allocated with new, usually on the heap, and you 
get a pointer to a struct. Or they can be created locally without 
"new", often on the stack or inside another struct/class 
instance, and what you obtain is a struct value.

std.random.Random is a struct.

std.random.uniform() as third optional value seems to accept both 
a struct pointer and a struct (that it takes by reference, so 
using a pointer adds another indirection level, and this is not 
good. I don't know if the D compiler is able to remove this extra 
indirection level).

Are my answers enough?

Bye,
bearophile
August 04, 2012
Re: Random Numbers
On Saturday, 4 August 2012 at 16:59:09 UTC, Philippe Sigaud wrote:
> On Sat, Aug 4, 2012 at 6:40 PM, Ralph Main <rmain1972@live.com> 
> wrote:
>
> Hello Ralph,
>
>> The module std.random documentation doesn't work as per the 
>> examples.
>> The example shows getting a random number by the following 
>> code does not
>> work:
> (snip)
>
> Both code samples you gave work perfectly for me (DMD 2.060, 
> Linux).
> Which version are you using?

DMD32 D Compiler v2.059 on Linux (Fedora 17)

All I know, is that it wasn't working, and I finally got it to 
work when I used the new keyword.

I tried the code in just main() like bearophile's post, and it 
worked just fine.  I also removed the new keyword from my program 
and it compiled.

The error message that I got yesterday with the example code 
returned an error message that had something do with void and 0 
arguments.

<shrug>

Thanks to both of you for the information.
August 04, 2012
Re: Random Numbers
On Saturday, 4 August 2012 at 17:02:19 UTC, bearophile wrote:
> Ralph Main:
>
>> The module std.random documentation doesn't work as per the 
>> examples.
>> The example shows getting a random number by the following 
>> code does not work:
>>
>> <code>
>>    // Generate a uniformly-distributed integer in the range 
>> [0, 14]
>>    auto i = uniform(0, 15);
>>    // Generate a uniformly-distributed real in the range [0, 
>> 100)
>>    // using a specific random generator
>>    Random gen;
>>    auto r = uniform(0.0L, 100.0L, gen);
>> </code>
>>
>> <code>
>>    // Gets a random number
>>    int get_random() {
>>        auto rng = Random(unpredictableSeed);
>>        auto rn = uniform(0, m_files.length, rng);
>>        return rn;
>>    }
>> </code>
>
> This code works, but it's a bad idea to create a new generator 
> inside getRandom():

get_random is inside of a class.  Because of scope problems, I 
don't think I can put it anywhere else.  It would be better if 
you could create rng as

int rng;
rng = Random(unpredictableSeed);

then you would be able to put it elsewhere.

Ralph
August 04, 2012
Re: Random Numbers
On Saturday, 4 August 2012 at 17:45:19 UTC, Ralph Main wrote:
> On Saturday, 4 August 2012 at 17:02:19 UTC, bearophile wrote:
>> Ralph Main:
>>
>>> The module std.random documentation doesn't work as per the 
>>> examples.
>>> The example shows getting a random number by the following 
>>> code does not work:
>>>
>>> <code>
>>>   // Generate a uniformly-distributed integer in the range 
>>> [0, 14]
>>>   auto i = uniform(0, 15);
>>>   // Generate a uniformly-distributed real in the range [0, 
>>> 100)
>>>   // using a specific random generator
>>>   Random gen;
>>>   auto r = uniform(0.0L, 100.0L, gen);
>>> </code>
>>>
>>> <code>
>>>   // Gets a random number
>>>   int get_random() {
>>>       auto rng = Random(unpredictableSeed);
>>>       auto rn = uniform(0, m_files.length, rng);
>>>       return rn;
>>>   }
>>> </code>
>>
>> This code works, but it's a bad idea to create a new generator 
>> inside getRandom():
>
> get_random is inside of a class.  Because of scope problems, I 
> don't think I can put it anywhere else.  It would be better if 
> you could create rng as
>
> int rng;
> rng = Random(unpredictableSeed);
>
> then you would be able to put it elsewhere.
>
> Ralph

I did take out the new keyword. So I guess the garbage collector 
will be happier. ;)
August 04, 2012
Re: Random Numbers
On Sat, Aug 4, 2012 at 7:27 PM, Ralph Main <rmain1972@live.com> wrote:

> I tried the code in just main() like bearophile's post, and it worked just
> fine.  I also removed the new keyword from my program and it compiled.
>
> The error message that I got yesterday with the example code returned an
> error message that had something do with void and 0 arguments.

In your previous code, did you put it in the module scope or in a
function? (main() is a function)
August 04, 2012
Re: Random Numbers
On Saturday, 4 August 2012 at 20:22:23 UTC, Philippe Sigaud wrote:
> On Sat, Aug 4, 2012 at 7:27 PM, Ralph Main <rmain1972@live.com> 
> wrote:
>
>> I tried the code in just main() like bearophile's post, and it 
>> worked just
>> fine.  I also removed the new keyword from my program and it 
>> compiled.
>>
>> The error message that I got yesterday with the example code 
>> returned an
>> error message that had something do with void and 0 arguments.
>
> In your previous code, did you put it in the module scope or in 
> a
> function? (main() is a function)

It was in the scope of a public function in a class.  I was 
experimenting with the D language.  Trying it out.  I like it, 
but there are some things that I don't like (but that is true of 
any programming language.)

class A {
private:
     //Code
public:
    int get_random() {
    //Code
    }
}
Top | Discussion index | About this forum | D home