Avatar billede spidr Nybegynder
30. juli 2007 - 08:44 Der er 25 kommentarer og
1 løsning

Forøge chancen for et bestemt tal fra en array bliver taget

Jeg bruger koden nede for til at tage en tilfældig "samtale" fra min samtale database til mit spil.

Den tager automatisk en samtale der passer til ens level (eller flere levels, hvoraf ens level indgår)

Hvad jeg gerne vil lave er; så der er større chance for at den tager en samtale der passer til ens level end til flere levels.

Når der i array'en står 50, betyder det at samtalen passer til alle levels mellem 5 og 0, når der står -15 er det alle levels mellem -1 og 5.

-10 er level -1 og 0.

Hvis der bare står et enkelt tal i array'en så er det den level. Og det er chancen for at det tal bliver taget jeg vil have forøget. Har selv prøvet at skrive 0,0,0,0,0 men det forøger jo ikke chancen som jeg ellers havde håbet lidt på :D

------------


if ($girlpoints < -1) { $vaelgfra = array(    -15,-10,-1);}
elseif ($girlpoints < 10){ $vaelgfra = array(    -15,-10,50,0);}
elseif ($girlpoints < 450){ $vaelgfra = array(    -15,    50,51,        41,        31,    21,    1);}
elseif ($girlpoints < 1200){ $vaelgfra = array(    -15,    50,51,52,    41,42,        31,32,    21,    2);}
elseif ($girlpoints < 7500){ $vaelgfra = array(    -15,    50,51,52,53,    41,42,43,    31,32,        3);}
elseif ($girlpoints < 30000){ $vaelgfra = array(-15,    50,51,52,53,54,    41,42,43,            4);}
else { $vaelgfra = array(            -15,    50,51,52,53,54,5);}

$query = mysql_query("SELECT * FROM LovehinaSpeak WHERE xp IN(". implode(",", $vaelgfra) .") and Girl = '$girl' order by RAND() limit 1");
Avatar billede jakobdo Ekspert
30. juli 2007 - 21:30 #1
Tror du kan bruge dette stykke info:

To obtain a random integer R in the range i <= R <  j, use the expression FLOOR(i + RAND() * (j – i)). For example, to obtain a random integer in the range the range 7 <= R <  12, you could use the following statement:

SELECT FLOOR(7 + (RAND() * 5));
Avatar billede spidr Nybegynder
30. juli 2007 - 23:32 #2
kan du forklare det nærmere?
Avatar billede jakobdo Ekspert
31. juli 2007 - 07:01 #3
Forstår du hvad der står?
Avatar billede spidr Nybegynder
31. juli 2007 - 10:56 #4
Ikke rigtigt nej, kan i hvert fald ikke se hvordan jeg kan bruge det :/
Avatar billede jakobdo Ekspert
31. juli 2007 - 18:16 #5
Se SQL funktionen/erne:

FLOOR(i + RAND() * (j – i))

Hvis du så vil have et RANDOM nummer mellem 0 og 5, så kan du lave:

i = 0;
j = 5;
FLOOR(i + RAND() * (j – i))
Så det bliver jo
FLOOR(0 + RAND() * (5 – 0))

Og forkortet:
FLOOR(RAND() * 5)
Avatar billede spidr Nybegynder
01. august 2007 - 10:08 #6
har siddet og læst på det nu, og forstår ikke hvordan det skal forøge chancen for at et af mine tal i min array bliver taget mere end de andre :S
Avatar billede jakobdo Ekspert
01. august 2007 - 19:12 #7
Chancen vil ikke være større.
Den vil bare "kun" give et tal mellem 0 og 5 f.eks.
Avatar billede spidr Nybegynder
01. august 2007 - 19:35 #8
chancen er større for hvad? :) Kan du ikke give mig et eksempel, forstår slet ikke hvordan det kan bruges i min kode :S
Avatar billede jakobdo Ekspert
01. august 2007 - 20:01 #9
Jeg kan ikke give et eksempel, for jeg har først efter at have læst et andet af dine spørgsmået forstået hvad du prøver.

Du kunne jo lave det sådan her:

Hvis du vil øge chancen for at der fremkommer et 0 frem for 1.
Kunne du lave:

$rand = array(0,0,1);
shuffle($rand);
echo current($rand);

Så vil der jo være 66% chance for det bliver 0 og 33% for det bliver 1.
Avatar billede spidr Nybegynder
01. august 2007 - 20:44 #10
ja, men problemmet med den er jo så hvis en af dem ikke findes :)

Den måde jeg har lavet nu, den tager jo højde for hvis en af dem ikke virker, kan det slet ikke lade sig gøre at lave det sådan?

(forresten er denne post og den andet om 2 forskellige problemmer, men tror måske jeg kan bruge det her i den anden :D)
Avatar billede jakobdo Ekspert
01. august 2007 - 20:55 #11
Hvis en af dem ikke findes?
Jeg tror du må lave noget kode, som først trækker alle data ud.
Så kan du lave noget PHP kode, som laver din prioritering.

F.eks. alle tal fra 90 - 100 skal indgå en gang.
80 - 90 skal indgå 2 gange.
0 - 10 skal indgå 10 gange.
Så vil det vil tal fra 0 - 10 med større sandsynlighed komme frem.
Avatar billede spidr Nybegynder
01. august 2007 - 21:01 #12
Hmm, det er jo det jeg slet ikke kan se hvordan jeg skal gøre :(
Avatar billede jakobdo Ekspert
01. august 2007 - 21:18 #13
Inden jeg evt. laver noget slamkode som kan hjælpe dig, tror jeg du skal sætte dig og lave noget "kode" som i dit hoved giver mening.
F.eks. tallene 1 - 10 skal komme 50%
11 - 20 skal komme 20 %
osv...
Avatar billede spidr Nybegynder
01. august 2007 - 21:43 #14
Men det er jo også det jeg synes jeg har gjort med koden her under, der vil jeg have dem til at blive vidst lidt alla som med det kode du gav (rand og shuffle) bare at den kun skal tage dem af dem med der rent faktisk findes :S

if ($girlpoints < -1) { $vaelgfra = array(    -15,-10,-1,-1,-1,-1,-1);}
elseif ($girlpoints < 10){ $vaelgfra = array(    -15,-10,50,0,0,0,0,0);}
elseif ($girlpoints < 450){ $vaelgfra = array(    -15,    50,51,        41,        31,    21,    1,1,1,1,1,1);}
elseif ($girlpoints < 1200){ $vaelgfra = array(    -15,    50,51,52,    41,42,        31,32,    21,    2,2,2,2,2,2);}
elseif ($girlpoints < 7500){ $vaelgfra = array(    -15,    50,51,52,53,    41,42,43,    31,32,        3,3,3,3,3,3,3);}
elseif ($girlpoints < 30000){ $vaelgfra = array(-15,    50,51,52,53,54,    41,42,43,            4,4,4,4,4,4,4);}
else { $vaelgfra = array(            -15,    50,51,52,53,54,5,5,5,5,5,5,5);}

$query = mysql_query("SELECT * FROM LovehinaSpeak WHERE xp IN(". implode(",", $vaelgfra) .") and Girl = '$girl' order by RAND() limit 1");
Avatar billede spidr Nybegynder
01. august 2007 - 21:52 #15
Mange tak for din hjælp i øvrigt, er lidt på herrens mark, har siddet med det mere eller mindre hele dagen nu :S
Avatar billede spidr Nybegynder
03. august 2007 - 16:50 #16
Hmm jakob, ingen hjælp at hente?
Avatar billede jakobdo Ekspert
04. august 2007 - 08:26 #17
Ahh.
Du bygger jo en masse arrays:

$vaelgfra = array(    -15,-10,-1,-1,-1,-1,-1);
osv..
Så kunne du lave:

$vaelgfra = array(    -15,-10,-1,-1,-1,-1,-1);
shuffle($vaelgfra);
$vaelg = current($vaelgfra);
$query = mysql_query("SELECT * FROM LovehinaSpeak WHERE xp = $vaelg and Girl = '$girl'  limit 1");
Avatar billede spidr Nybegynder
04. august 2007 - 11:42 #18
ville det også virke hvis nu en af dem ikke eksisterede? F.eks. hvis nu der ikke var en hvor xp = -15, ville den så bare tage en anden?
Avatar billede jakobdo Ekspert
04. august 2007 - 11:49 #19
Nej, det vil den så ikke.
Men hvorfor bede om at hente xp = -15, hvis der ikke er noget som finder på det?
Ellers skal du lave:

WHERE xp => $vaelg ORDER BY xp DESC LIMIT 1

Så vil den tage -15 hvis den findes eller næste level.
Avatar billede spidr Nybegynder
04. august 2007 - 12:12 #20
Hmm, svært at forklare :S

Men helt simpelt har jeg en lille tabel med samtaler (der er min. 1 samtale til hvert lvl (-1,0,1,2,3,4,5) og så derud over er der enkelte med 2 eller 3 og nogle enkelte der gælder for flere levels altså dem med 2 tal. f.eks. -15 (der gælder for alle levels fra -1 til 5)

Men problemmet med det du foreslår er at hvis man har en pige i level 5, skal der jo ikke være en chance for at få en samtale der høre til level 2 eller sådan noget, så skal det være en der både høre til level 2 og 5.

Derfor den noget besværlige array jeg har lavet oppe over, for at sørge for at den altid finder en der passer til ens level. Mit problem er så at dem der høre til flere levels kommer virkelig mange gange i løbet af en spillers "liv" fordi han får den på alle levels.

En eller anden dag vil jeg nok have samtaler til alle level de muligheder der er, men indtil da ville jeg gerne have et system der kun tog dem der var. Men hvis ikke man kan lave et system der gør det er jeg vel bare nødt til at lave det lidt om, så jeg kun har de mulighedder i array'en der findes, bare irriterende at skulle tilføje nye hele tiden :S
Avatar billede jakobdo Ekspert
04. august 2007 - 12:41 #21
Jeg ville lave det sådan her:

Træk XP ud fra tabel WHERE XP between -1 AND 5 AND GIRL = $girl

Så skal du lave noget kode som fordobler de rækker som du skal have nogle flere af.
(Brug evt. array_pad())

shuffle($xpArray);
echo current(xpArray); //Her får du så en tekst ud og eftersom du har lavet dit array med flere værdier af dem der med stor sandsynlighed skal komme frem, er det vel det?
Avatar billede spidr Nybegynder
04. august 2007 - 12:54 #22
Det var en god ide, det er grunden til der er så meget jeg ikke kan få lavet selv, finder aldrig selv på den slags løsninger :)

Mange tak, burde kunne lade sig gøre :) (skriver igen hvis ikke :P)
Avatar billede jakobdo Ekspert
04. august 2007 - 12:57 #23
Det er bare helt i orden du! :o)
Avatar billede spidr Nybegynder
07. august 2007 - 18:52 #24
Får jeg et svar, du har jo næsten svaret på mit spørgsmål?
Avatar billede jakobdo Ekspert
08. august 2007 - 08:41 #25
Svar!
Avatar billede jakobdo Ekspert
08. august 2007 - 09:36 #26
Takker for point.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB