Thread overview | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
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 | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ralph Main | 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 | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ralph Main | 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 | ||||
---|---|---|---|---|
| ||||
Posted in reply to Philippe Sigaud | 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 | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | 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 | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ralph Main | 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 | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ralph Main | 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 | ||||
---|---|---|---|---|
| ||||
Posted in reply to Philippe Sigaud | 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
}
}
|
Copyright © 1999-2021 by the D Language Foundation