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