# [PHP] Zufallszahlenziehung mit Wahrscheinlichkeit beeinflussen?



## Nilman (28. März 2007)

Hi!
Habe zur Zeit ein kleines Problem, bei dem ich nicht weiterkomme! Hab schon gegoogelt und gesucht, aber zu einer Lösung bin ich leider noch nicht gekommen. 
Und zwar will ich eine Zufallszahl ziehen lassen und mit einer festen Größe Vergleichen lassen. Soweit ist das ja kein Problem:

<?php  
$zufall = rand(1,10);
if($zufall == "1")
{  ...  }
?> 
Bei dem Beispiel wäre die Wahrscheinlichkeit 10%, dass die "1" getroffen wird.
Allerdings will ich, dass ich die Wahrscheinlichkeit beeinflussen kann. Also die Wahrscheinlichkeit soll mal 10%, 60% oder auch 0,001% sein. Und genau das ist mein Problem: Das die Wahrscheinlichkeiten mal größer und kleiner 1% sind ...

Hat jemand vielleicht einen Ansatz? 

thx Nilman


----------



## webmanie (28. März 2007)

hi,
wenn ich dich richtig verstanden habe willst du die wahrscheinlichkeit beeinflussen. Das machst du doch schon in dem du den zweiten Parameter bestimmst. Oder?

rand(1,10) oder (1,30) usw. 

Verstehe noch nicht ganz das Problem... ist das nun eine mathematische oder programmiertechnische Herausforderung?

gruss


----------



## Gumbo (28. März 2007)

Vielleicht hilft dir das Thema Zufallsfunktion mit Priorisierung weiter.


----------



## CheckTheFlow (28. März 2007)

Hi,
hier eine einfache Lösung für dein Problem:

<?
$arVerteilung = array(
		array(0,5),
		array(1,50),
		array(2,25),
		array(3,20)
		);

$arValues = GetRandom(10,$arVerteilung);
highlight_string(print_r($arValues,true));

function GetRandom($anz,$verteilung)
{
	$index = 0;
	$artmp = array();
	$arret = array();
	for($i=0;$i<sizeof($verteilung);$i++)
	{
	$artmp = array_merge($artmp,array_fill($index,$verteilung[$i][1],$verteilung[$i][0]));
		$index += $verteilung[$i][1];
	}

	for($i=0;$i<$anz;$i++)
		array_push($arret, $artmp[rand(0,sizeof($artmp)-1)]);

	return $arret;
}
?>

In $arVerteilung bestimmst du, wie die Verteilung der einzelnen Elemente aussehen. In meinem Beispiel hat die Zahl 0 die Wahrscheinlichkeit von 5% ( da die Anzahl insgesamt 100 ergibt), 1 hat 50% usw...

Über den Parameter $anz kannst du bestimmen, wieviele Elemente due ausgeben möchtest.

Gruss
Flo


----------



## Nilman (28. März 2007)

Hmm; es funktioniert zwar, aber nicht für 0,01%; also wenn die Wahrscheinlichkeit unter 1% ist, gehts nicht - und genau das ist ja auch mein Problem :-(


----------



## Gumbo (28. März 2007)

Du musst die Wahrscheinlichkeit auch durch ein Verhältnis ausdrücken, also beispielsweise:
	
	
	



```
array(
	array(0, 1),
	array(1, 100)
)
```
Aber nimm lieber meine Funktion, die ist schneller und vielleicht auch verständlicher.

Was genau versuchst du eigentlich zu realisieren?


----------



## judos (14. April 2007)

bin auch gerade auf dieses Problem gestossen, und habe eine einfache Lösung dafür:

<?php
$zufall = rand(1,100);
if($zufall == "1")
{ ... }
?>

hier überprüftst du ob eine aus hundert Zahlen ausgewählt wurde, die Chance beträgt also: 1%

wenn du mit einer Wahrscheinlichkeit von z.b. 60% etwas tun willst dann geht das so:
<?php
$zufall = rand(1,100);
if($zufall <= '60')
{ ... }
?> 

hier überprüfst du ob eine der 60 Zahlen von 100 ausgewählt wurde, 60 von 100 = 60%

mit 0,01% kannst du das dann so machen:
<?php
$zufall = rand(1,10000);
if($zufall == "1")
{ ... }
?> 

hier ist die Chance das "1" ausgewählt wird = 0.01% da dies eine von 10'000 Zahlen ist.


/edit:
ich glaube das sollte noch leichter zu verstehen sein als die Funktion von Gumbo ;-)

mfg judos


/edit2:
hier nochmals ganz allgemein eine Funktion die mit einer Wahrscheinlichkeiten von 0 bis 100% mit einer maximalen genauigkeit von 0,001% eine 1 zurück gibt:

function wahrscheinlichkeit($chance)  //Liefert mit der Wahrscheinlichkeit von $chance % eine 1 zurück
{
	$g=mt_rand(0,100)
	if ($g<100)
	{
		if ($g==0)	$h=mt_rand(1,999);
		else		$h=mt_rand(0,999);
	}
	$zahl=$g+$h*0.001;
	if ($zahl<=$chance) return 1;
	else	return 0;
}


----------



## C K (14. April 2007)

irgendwie erinnert mich 0,001% an irgendein mmorpg game was gerade aktuell ist 

Wozu möchtest du denn genau die Wahrscheinlichkeit beeinflussen?
Denn die wahrscheinlichkeit von 10% bedeutet ja nicht das sie bei 100 fällen 10 mal kommt.
Wenn du das aber willst musst du die bisherigen fälle dokumentieren und danach die "Zufälligkeit" anpassen.
Bsp. 
Du willst das zb ein Banner 10% mal angezeigt wird und ein anderes 60% und wieder ein anderes 30%.
Das heisst du musst die Zufallszahlen speichern und den Generator anpassen.
Also musst du die bisherigen Aufrufe in deine Zufallsgenerierung einbeziehen und 
nach 100 Aufrufen zb wieder Reseten.
Wenn du das erreichen willst kann man dir nen Codeschnipsel als Gedanken anstoss
zukommen lassen 

mfg


----------

