$index= rand(@array);
1 2 3 4 5 6 7 8 9 10
#!/usr/bin/perl use strict; use warnings; my @array = (1..10); for (1..100) { my $rand_index = $array[rand($#array)+1]; print "$rand_index\n"; }
2014-04-14T14:06:46 styx-cc
QuoteEs scheint als sei ein normaler Arrayzugriff $foo[$bar] äquivalent zu $foo[int($bar)], der Index wird also immer abgerundet.
Da rand irgendeine reelle Zahl kleiner als sein Argument und größer gleich Null liefert, sollte int(rand(@foo)) einen zufälligen, ganzzahligen Arrayindex für @foo liefern.
2014-04-14T14:17:02 murphyEs scheint als sei ein normaler Arrayzugriff $foo[$bar] äquivalent zu $foo[int($bar)], der Index wird also immer abgerundet.
Da rand irgendeine reelle Zahl kleiner als sein Argument und größer gleich Null liefert, sollte int(rand(@foo)) einen zufälligen, ganzzahligen Arrayindex für @foo liefern.
Wie fair gleichverteilt diese Indices sind steht in den Sternen, weil rand irgendeinen von der verwendeten C-Standardbibliothek abhängigen Zufallsgenerator benutzt. Kryptographisch hochwertige Ergebnisse, die auch bei ein paar Millionen generierten Indices noch schön gleichverteilt sind, sollte man nicht erwarten!
2014-04-14T13:56:26 ariserNun stell ich fest, da ist dann ein float drin und kein Integer. Das ist mir unheimlich und erschwert in meinem Fall auch die Fehlersuche.
Da kommen zwei Fragen auf.
1. wie sauber ist der erste Code überhaupt? Kann man sich denn drauf verlassen, dass ein irgendwie liegender float als Array-Index immer gleich gerundet/geschnitten wird?
Quote2. wie mach ichs richtig, vor allem unter dem Aspekt, dass bitte alle Indices des Arrays gleich häufig gezogen werden sollen?
2014-04-14T14:19:39 Raubtier(...)
Der Nachkommawert wird in den [] abgeschnitten, ist also alles ok.
1
2
3
4
5
perl -MPOSIX -E'@x=qw(a b c d); say $x[$_] for (-2, -2.9, int(-2.9), POSIX::floor(-2.9))'
c
c
c
b