[your code here]
Timon Gehr
timon.gehr at gmx.ch
Fri Feb 17 18:07:56 PST 2012
On 02/18/2012 02:52 AM, Alf P. Steinbach wrote:
> On 18.02.2012 02:39, H. S. Teoh wrote:
>> // Outputs a randomly selected line from standard input with equal
>> // likelihood.
>> import std.random;
>> import std.stdio;
>>
>> void main() {
>> auto n = 0;
>> string choice;
>> foreach (line; stdin.byLine()) {
>> n++;
>> if (uniform(0,n) == 0)
>> choice = line.idup;
>> }
>> writeln(choice);
>> }
>>
>>
>> P.S. Proof that the probability any line is selected is exactly 1/n
>> (where n is the total number of lines read) is left as an exercise for
>> the reader. ;-)
>
> Assuming that by "any" you mean "any particular", you would have to read
> all the lines first. Otherwise, if the code selects the first line with
> probability 1/K, then I can just input some other number of lines.
>
>
>> P.S.S. The .idup is a bit ugly, but necessary, since apparently byLine()
>> calls readln() with a static buffer, so choice will be silently
>> overwritten if the .idup is omitted.
If the .idup is omitted the code does not compile. It does not silently
misbehave. That is why we have a const system.
>
> That sounds ominous. One should never have to be aware of low level
> details in order to do simple string assignment or initialization, when
> the source already is a string.
The source is not a string, it is a char[].
> Does one really have to do that in D?
>
>
> Cheers & hth.,
>
> - Alf
File.byLine re-uses the buffer in order to be more efficient. This
appears in the documentation, and the buffer is typed appropriately.
More information about the Digitalmars-d
mailing list