webForumDet fria alternativet

Slumptal och while-loop = fel?

5 svar · 379 visningar · startad av muskot

muskotMedlem sedan jan. 20027 905 inlägg
#1

Har gjort ett skript som ska slumpa fram två tal som inte får vara identiska. För att se till detta har jag lagt in slumpningen i en while-loop som körs tills de båda talen inte är identiska.

Dessutom vill jag att hela härligheten ska köras tio gånger, så att jag får tio OLIKA uppsättningar av de två olika talen.

Det som händer nu är alltså att jag får tio IDENTISKA uppsättningar av talen. Om talen är 6 och 9 får jag jag följande output:

slump1: 6, slump2: 9
slump1: 6, slump2: 9
slump1: 6, slump2: 9
slump1: 6, slump2: 9
slump1: 6, slump2: 9
slump1: 6, slump2: 9
slump1: 6, slump2: 9
slump1: 6, slump2: 9
slump1: 6, slump2: 9
slump1: 6, slump2: 9

Jag vill alltså att nya tal ska slumpas fram för varje rad.

Så här ser koden ut:

<?php
$i = 1;
while ($i <= 10):

	while ($slumptal == $slumptal2): // se till att tecknen är olika
		list( $usec, $sec ) = explode( ' ', microtime() );
		srand( ( ( float ) $sec ) + ( ( float ) $usec * 1234567 ) );
		$slumptal = rand( 0, 9 );
		$slumptal2 = rand( 0, 9 );
	endwhile;

	echo "slump1: $slumptal, ";
	echo "slump2: $slumptal2<br>";

	$i++;

endwhile;
?>

Jättetacksam för hjälp.

jarvkloMedlem sedan juli 20013 378 inlägg
#2

Du behöver inte köra srand i varje varv, och du behöver bara ändra slumptal2 tills det skiljer sig från slumptal1.

<?php
$i = 1;
        list( $usec, $sec ) = explode( ' ', microtime() );
        srand( ( ( float ) $sec ) + ( ( float ) $usec * 1234567 ) );
while ($i <= 10):
        $slumptal = rand( 0, 9 );
        $slumptal2 = rand( 0, 9 );
	  while ($slumptal == $slumptal2): // se till att tecknen är olika
        	$slumptal2 = rand( 0, 9 );
    	  endwhile;

    echo "slump1: $slumptal, ";
    echo "slump2: $slumptal2<br>";

    $i++;
endwhile;
?>
muskotMedlem sedan jan. 20027 905 inlägg
#3

Aha...
Tusen tack för hjälpen!

muskotMedlem sedan jan. 20027 905 inlägg
#4

Sitter och funderar...
Finns det något smidigt sätt att göra samma sak, men med fler tal?

Om jag till exempel vill ha 5 eller ännu fler unika slumptal blir det ju ganska krångligt om man måste göra på följande vis:

<?php
$i = 1;
	list( $usec, $sec ) = explode( ' ', microtime() );
	srand( ( ( float ) $sec ) + ( ( float ) $usec * 1234567 ) );
while ($i <= 10):

// slumpa fem tecken
	$slumptal = rand( 0, 9 );
	$slumptal2 = rand( 0, 9 );
	$slumptal3 = rand( 0, 9 );
	$slumptal4 = rand( 0, 9 );
	$slumptal5 = rand( 0, 9 );

	while ($slumptal == $slumptal2 OR $slumptal == $slumptal3 OR $slumptal == $slumptal4 OR $slumptal == $slumptal5): // se till att tecknen är olika
		$slumptal2 = rand( 0, 9 );
		$slumptal3 = rand( 0, 9 );
		$slumptal4 = rand( 0, 9 );
		$slumptal5 = rand( 0, 9 );
	endwhile;

	while ($slumptal2 == $slumptal3 OR $slumptal2 == $slumptal4 OR $slumptal2 == $slumptal5): // se till att tecknen är olika
		$slumptal3 = rand( 0, 9 );
		$slumptal4 = rand( 0, 9 );
		$slumptal5 = rand( 0, 9 );
	endwhile;

	while ($slumptal3 == $slumptal4 OR $slumptal4 == $slumptal5): // se till att tecknen är olika
		$slumptal4 = rand( 0, 9 );
		$slumptal5 = rand( 0, 9 );
	endwhile;

	while ($slumptal4 == $slumptal5): // se till att tecknen är olika
		$slumptal5 = rand( 0, 9 );
	endwhile;

	$i++;

endwhile;
?>

Det känns som om det borde finnas något smidigare sätt...

Tacksam för hjälp.

muskotMedlem sedan jan. 20027 905 inlägg
#5

Nåja, lite bättre iaf (fungerar t o m :):

<?php
$i = 1;
	list( $usec, $sec ) = explode( ' ', microtime() );
	srand( ( ( float ) $sec ) + ( ( float ) $usec * 1234567 ) );
while ($i <= 10):

// slumpa fem tecken
	$slumptal = rand( 0, 9 );
	slumptal2 = rand( 0, 9 );

	while ($slumptal2 == $slumptal): // se till att tecknen är olika
		$slumptal2 = rand( 0, 9 );
	endwhile;

	$slumptal3 = rand( 0, 9 );

	while ($slumptal3 == $slumptal OR $slumptal3 == $slumptal2): // se till att tecknen är olika
		$slumptal3 = rand( 0, 9 );
	endwhile;

	$slumptal4 = rand( 0, 9 );

	while ($slumptal4 == $slumptal OR $slumptal4 == $slumptal2 OR $slumptal4 == $slumptal3): // se till att tecknen är olika
		$slumptal4 = rand( 0, 9 );
	endwhile;

	$slumptal5 = rand( 0, 9 );

	while ($slumptal5 == $slumptal OR $slumptal5 == $slumptal2 OR $slumptal5 == $slumptal3 OR $slumptal5 == $slumptal4): // se till att tecknen är olika
		$slumptal5 = rand( 0, 9 );
	endwhile;

	$i++;

endwhile;
?>
jarvkloMedlem sedan juli 20013 378 inlägg
#6

Du kan använda en array om du vill slippa ifrån alla repetitioner av kod...

<?php
list( $usec, $sec ) = explode( ' ', microtime() );
srand( ( ( float ) $sec ) + ( ( float ) $usec * 1234567 ) );
for ($i=0;$i<10;$i++) { // tio repetitioner
	$resultat=array();
	for( $j=0;$j<5;$j++) { // Tag ut en serie om 5 tal (OBS! tag aldrig ut fler än 9 tal mellan 0 och 9 - då blir loopen oändlig! !!!)
		do  {
			$slumptal = rand( 0, 9 );
		} while (isset($resultat["$slumptal"]));
		$resultat["$slumptal"] = $slumptal;
	}

	// Skriv ut arrayen som innehåller serien:
	foreach($resultat as $k) {
		echo("$k;");
	}
	echo("<br />");
}
?>
127 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
124 ms — hämta tråd, inlägg och bilagor (db)