Random string samples & unicode - Reprise

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Sun Sep 12 18:25:27 PDT 2010


On 09/12/2010 07:09 PM, bearophile wrote:
> Andrei Alexandrescu:
>> This goes into "bearophile's odd posts coming now and then".
>
> I assume you have missed most of the things I was trying to say, maybe you have not even read the original post. So I try to explain better a subset of the things I have written.
>
> This is a quite common piece of Python code:
>
> from random import sample
> d = "0123456789"
> print "".join(sample(d, 2))

Well it's not that common code. How often would one need to generate a 
string that contains two random but distinct digits?

> I need to perform the same thing in D.
> For me it's not easy to do that in D2 with Phobos2.
>
> This doesn't work:
>
> import std.stdio, std.random, std.array, std.range;
> void main() {
>      string d = "0123456789";
>      string res = array(take(randomCover(d, rndGen), 2));
>      writeln(res);
> }
>
> It returns:
> test.d(4): Error: cannot implicitly convert expression (array(take(randomCover(d,rndGen()),2u))) of type dchar[] to string

The code compiles and runs as written on my system. I think it's David 
Simcha who changed the return type to ForEachType!Range[]. I'm not sure 
I agree with that, as it takes an oddity of foreach that I hoped would 
go away some time and propagates it.

About the original problem: strings are bidirectional ranges of dchar, 
which is the way they ought to be. Algorithms used on top of strings 
will inherently traffic in dchar. If you want to get a string back, this 
should work:

string res = to!string(take(randomCover(d, rndGen), 2));

That doesn't work for a different reason, and is a bug worth filing. In 
fact - no need, I just submitted a fix 
(http://www.dsource.org/projects/phobos/changeset/1988). Thanks for 
bringing this up!


Andrei


More information about the Digitalmars-d mailing list