PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : rand() ohne wiederholung


Indyk
30.08.2006, 09:44:17
servus,

nun habe ich auch mal wieder eine frage
wie wir alle wissen liefer mir rand() eine zahl zwischen 0 und MAX_RAND
und das die zahl sich da wiederholt ist sehr sehr unwahrscheinlich
aber wenn ich ein kleines spektrum habe
z.b zwischen 1 und 5 und ich würfel 3x dann ist die wahrschenlichkeit das ich eine zahl doppelt habe sehr groß.

meistens möchte man aber keine zufällige zahl 2x haben, daher meine frage:
gibt es eine funktion die keine zufällig zahl 2x würfelt?

bis jetzt habe ich die zahlen immer in ein array gepackt, und bevor ich eine neue reingetan habe , mit in_array() überprüft ob sie schon vorhanden ist, und wenn ja dann nochmal gewürfelt.

nur ist dieser ablauf relativ kompliziert, oder vll. mache ich ihn mir einfach zu kompliziert?

bin für vorschläge offen

Indyk
30.08.2006, 09:50:42
hier noch als nachtrag wie ich es bisher gelöst habe

$random = array();
for($i=0;$i<$setup['anzahl'];$i++){
$z = rand(0,(count($text))-1);
$z = my_in_array($z,$random,(count($text))-1);
$random[$i] = $z;

}

und die funktion dazu

function my_in_array($in,$array,$rand){

if(in_array($in,$array)){
$in = rand(0,$rand);
return my_in_array($in,$array,$rand);
}
return $in;
}


um es vll. etwas zu erleutern, es handelt sich um eine random funktion für einen news-ticker

$setup['anzahl'] // Ist die anzahl der verschiedenen texte
$text // ist ein array mit allen verfügbaren texten

feuervogel
30.08.2006, 10:01:00
nein, es gibt keine solche funktion wie du sie dir wünschst. wobei du auch einfach folgendes machen kannst:


$text = array( 'text1' , 'text2' , 'text3' , 'text4' );
shuffle( $text );
$neuetexte = array();
for($i=0;$i<$setup['anzahl'];$i++){
$neuetexte[] = $text[ $i ];
}


in der variable $neuetexte stehen nun die zufällig ausgewählten texte, keiner kommt doppelt vor und es sind so viele wie angegeben.

Indyk
30.08.2006, 10:04:46
nun als beispiel
ich habe in der datebank 40 texte

möchte 5 wirkürliche haben
nach deinem vorschlag hätte ich aber
40 texte in einer wirkürlichen reihenfolge

ich möchte aber 5 zufällige, nicht doppelte
texte aus 40 raussuchen

Andes
30.08.2006, 10:30:33
Warum verwendest du nicht rand() in Verbindung mit Limit in deinem Select?

Indyk
30.08.2006, 10:40:06
weil ich dort ebenfalls eine abfrage auf wiederholung machen müsste?

Andes
30.08.2006, 11:15:12
Wie oft ist es den schon vorgekommen, dass Texte doppelt angezeigt werden, wenn du rand() in dem Select verwendest?

Indyk
30.08.2006, 11:20:47
wo ist denn der unterschied ob ich ein rand() select oder einen rand() auf einen gleich großen array ausführe?

ich habe aber leider keine statistik für dich, die dir eine prozentuale auswertung aufzeigt.

und nur damit wir uns richtig verstehen wir reden von so einem select?

$sql = "SELECT text
FROM ticker_text
WHERE id = '".rand(0,$max)."';";

Andes
30.08.2006, 11:32:48
Einfacher wäre solch eine Abfrage.

SELECT text FROM ticker_text ORDER BY RAND() LIMIT 5;

Ich meinte halt rand() in Mysql und nicht PHP.

Davon mal abgesehen, würde dir dein Select nur einen Datensatz liefern. Genau den, bei dem id und Zufallszahl übereinstimmen.

Indyk
30.08.2006, 11:36:37
ahhhh
das ist genial
immer wieder schön zu sehen was mySQL kann

thx!

feuervogel
30.08.2006, 23:46:50
nun als beispiel
ich habe in der datebank 40 texte
vielleicht legst du dich mal fest. erst hast du die texte in einem array, dann in einer datenbank. das gestaltet das ganze schon mal ganz anders.
möchte 5 wirkürliche haben
nach deinem vorschlag hätte ich aber
40 texte in einer wirkürlichen reihenfolge

ich möchte aber 5 zufällige, nicht doppelte
texte aus 40 raussuchen

stimmt. du hast 40 texte in willkürlicher reihenfolge, nimmst die ersten 5 und hast somit 5 stück zufällig ausgewählt und es sind alle unterschiedlich...

Indyk
31.08.2006, 07:20:58
Sehr geehrter Herr Feuervogel (- ;

Ich habe texte in der Datenbank und Lade sie in einen Array, da ich zuvor mit dem array gearbeitet habe, war ich auch fest davon überzeugt das ich es weiterhin tun muss, das diese annahme nicht richtig war, haben wir bereits festgestellt und eine lösung des Problems ist ebenfalls schon gegeben worden.

was Ihre zweite Aussage angeht:
Sie haben einfach nur recht, und mehr gibt es dazu nicht zu sagen (- ;

Mit freundlichen grüßen