in reply to Re^2: Pick k numbers at random
in thread Pick k numbers at random
just for fun a solution exploiting the randomness of hash keys.
hkey => sub{ my @range = (keys %{+{map {($_ => 1)}0 .. $N-1}})[0 .. $K-1]; }
It is slightly faster than samp for very small sets..
..but becomes fastly slower ;) for bigger ones.perl randomshuffle.pl 10 5 Rate samp hkey shuf mpu samp 108393/s -- -13% -88% -92% hkey 124178/s 15% -- -87% -90% shuf 934174/s 762% 652% -- -27% mpu 1275273/s 1077% 927% 37% --
perl randomshuffle.pl 100 5 Rate hkey samp shuf mpu hkey 15844/s -- -46% -93% -99% samp 29546/s 86% -- -86% -98% shuf 212991/s 1244% 621% -- -86% mpu 1519656/s 9491% 5043% 613% --
The only thing to note is the %{+{ LIST }} syntax, where + is used to disambiguate a hashref from a block (credit: perl IRC channel) because you can't dereference a map as a hash.
PS: your hardware is ~3 times faster than mine ;)
PPS: "randperm" is not exported by the Math::Prime::Util module in 0.60 so i upgraded to 0.73
L*
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^4: Pick k numbers at random -- hash keys
by AnomalousMonk (Archbishop) on Nov 12, 2019 at 23:16 UTC | |
by syphilis (Archbishop) on Nov 13, 2019 at 01:06 UTC | |
by Discipulus (Canon) on Nov 13, 2019 at 08:52 UTC | |
by choroba (Cardinal) on Nov 13, 2019 at 15:55 UTC |