PHP Random tekst inladen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
Na veel gezoek en gerommel aan me code ben ik nog steeds niet verder gekomen dan het volgende:

Ik wil dat een PHP script een .txt bestand inlaad en vervolgens willekeurig 3 regels van het X aantal regels in het .txt bestand op het scherm laat zien. Er hoeft geen timer achter te zitten, dus alleen bij een refresh moeten er 3 nieuwe regels verschijnen. Nu heb ik de volgende code die netjes 3 regels uit het .txt bestand haalt en op het scherm toont.
PHP:
1
2
3
4
5
6
7
8
9
10
<?php

$file = "1.txt";
$regel = file($file);

echo $regel[rand(0, count($regel)-1)];
echo $regel[rand(0, count($regel)-1)];
echo $regel[rand(0, count($regel)-1)];

?>


Maar nu krijg ik dus het volgende: Regelmatig worden dezelfde waarde 2x (heel soms zelfs 3x) getoond. Dus 2 dezelfde regels uit het .txt bestand.

Hoe kan ik er voor zorgen dat er geen dubbele regels ontstaan?

Voorbeeld van een tekst bestand is:
<h2>Kop 1</h2>Hier moet regel 1 komen.
<h2>Kop 2</h2>Hier moet regel 2 komen.
<h2>Kop 3</h2>Hier moet regel 3 komen.
<h2>Kop 4</h2>Hier moet regel 4 komen.
<h2>Kop 5</h2>Hier moet regel 5 komen.

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Het beste kun je een array maken met de getallen 1 t/m maximaal regelnummer, die willekeurig gaan mengen, en dan bijvoorbeeld de bovenste 3 nemen. Voordeel is dat je uit het bestand ook slechts die regels ophaalt en zo geheugen bespaart.

Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Een random number in een PC is niet random, over het algemeen wordt de tijd als seed gebruikt en bij het snel achter elkaar genereren van een random number komt daar dus hetzelfde nummer uit. Bij PHP kan je de functie mt_rand() gebruiken om betere random numbers te genereren, misschien heb je er dan geen last meer van?

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • mjax
  • Registratie: September 2000
  • Laatst online: 20:52
PHP:
1
2
3
4
5
6
7
8
$file = "1.txt";
$regel = file($file);

array_shuffle($regel);

echo $regel[0];
echo $regel[1];
echo $regel[2];

[ Voor 29% gewijzigd door mjax op 22-11-2006 19:04 ]


Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$file = "1.txt";
$regel = file($file);

$prev_id = -1
for ($i=1; $i <= 3; $i++) {
  $id=rand(0, count($regel)-1)
  while ($id = $prev_id)
    $id = rand(0, count($regel)-1)
  }
  echo $regel[$id];

}

Zoiets?? :)

Acties:
  • 0 Henk 'm!

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
mjax schreef op woensdag 22 november 2006 @ 19:03:
PHP:
1
2
3
4
5
6
7
8
$file = "1.txt";
$regel = file($file);

array_shuffle($regel);

echo $regel[0];
echo $regel[1];
echo $regel[2];
Ik krijg dan de volgende error: Fatal error: Call to undefined function array_shuffle() in random.php on line 5

[ Voor 3% gewijzigd door DeepFreeze.NL op 22-11-2006 19:07 ]


Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Omdat het niet array_shuffle() is maar shuffle().

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • mjax
  • Registratie: September 2000
  • Laatst online: 20:52
DeepFreeze.NL schreef op woensdag 22 november 2006 @ 19:05:
[...]

Ik krijg dan de volgende error: Fatal error: Call to undefined function array_shuffle() in random.php on line 6
array_shuffle = shuffle

Sorry, het was niet getest.

Acties:
  • 0 Henk 'm!

  • sirdupre
  • Registratie: Maart 2002
  • Laatst online: 27-04 09:36
Het is al een tijdje geleden dat ik PHP geprogrammeerd heb en ik heb dit ook niet getest, maar dit zou iets moeten doen. Het is wel een las vegas algoritme, dus je hebt theoretisch een kans dat ie oneindig lang aan het runnen is (maar de kans dat ie termineert is wel 100%, snap je het nog? ;))

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

$file = "1.txt";
$regel = file($file);
$size = count($regel)-1;
$rand = {0,0,0};

do
{
  for ($i = 0; $i < 3; $i++) rand[$i] == rand(0, $size);
} while (rand[0] == rand[1] && rand[1] == rand[2] && rand[0] == rand[2] && $size > 2)

for ($i = 0; $i < 3; $i++) echo $regel[$rand[$i]];

?>

Overigens verwacht ik dat dit algoritme efficienter is dan de array shuffle als je tekstbestand veel regels bevat. Als je tekstbestand weinig regels bevat, zou de array shuffle gemiddeld sneller moeten zijn. Je zou een wiskundige schatting kunnen maken van waar het omslagpunt zit, maar experimenteel moet dat ook wel vast te stellen zijn, mocht het je interesseren.

[ Voor 24% gewijzigd door sirdupre op 22-11-2006 19:12 . Reden: opmerking toegevoegd ]


Acties:
  • 0 Henk 'm!

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
mjax schreef op woensdag 22 november 2006 @ 19:06:
[...]

array_shuffle = shuffle

Sorry, het was niet getest.
Woohoo, dankje man! _/-\o_

Acties:
  • 0 Henk 'm!

  • Reinier
  • Registratie: Februari 2000
  • Laatst online: 21:27

Reinier

\o/

Let wel op dat het niet goed gaat als je minder dan drie regels hebt B)
Pagina: 1