shuffling flaw, and MASH call-for-support
- To: mathgroup at smc.vnet.net
- Subject: [mg28475] shuffling flaw, and MASH call-for-support
- From: Daniel Reeves <dreeves at eecs.umich.edu>
- Date: Fri, 20 Apr 2001 04:24:23 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
>
> scramble[list_] := Sort[list, (Random[Integer] == 1) &]
>
I don't think that will always work, depending on the implementation of
Sort...
In fact, here's a way to see that it doesn't:
ListPlot[scramble[Range[100000]]];
vs
ListPlot[RandomPermutation[100000]];
Speaking of shuffling, below is a shell-/perl-script-style mathematica
program to shuffle the lines of text sent to it on stdin.
I'm trying to convince people at Wolfram that Mathematica should be able
to be used this way without a mathlink wrapper. Every other "real
language" can do this so for Mathematica to be taken seriously by
programmers as a programming language, it needs to be able to do this too.
If you agree, please send me an email. A simple "yeah, I might use that"
is sufficient.
#!mash
(* A sample mathematica script -- the inverse of the
unix sort utility.
If a number is specified as a command line argument,
returns only that many of the lines.
So this can be used like RandomKSubset for files.
Example usage: shuffle.m 3 < test.txt | sort
Takes 3 random lines from test.txt and outputs
them in sorted order.
(The functions readList, pout, and perr are defined
in MathIO.m which is automatically loaded by mash.
See http://ai.eecs.umich.edu/people/dreeves/mash )
*)
(* FUNCTIONS ********************************************)
(* Shuffles a list. Inspired by RandomPermutation. *)
shuffle[l_List] := #2& @@@ Sort[{Random[],#}& /@ l]
(* MAIN *************************************************)
(* number of lines to output, specified on command line *)
numWanted = If[Length[ARGV]<2, Infinity,
ToExpression[ARGV[[2]]]];
If[Length[ARGV]>2,
perr["Usage: ", ARGV[[1]], " [num of lines]\n";]];
(* gets a list of all the lines on stdin *)
lines = readList[];
numLines = Length[lines];
(* prints numWanted of them in random order to stdout *)
pout @@ Take[shuffle[lines], Min[numLines, numWanted]];
-- -- -- -- -- -- -- -- -- -- -- --
Daniel Reeves http://ai.eecs.umich.edu/people/dreeves/
The goal of Computer Science is to build something that will last at
least until we've finished building it.