Windows.  Virus.  Anteckningsböcker.  Internet.  kontor.  Verktyg.  Förare

välj element (11)

Jag har en array som heter $ran = array(1,2,3,4);

Jag behöver få ett slumpmässigt värde från denna array och lagra det i en variabel, hur kan jag göra det?

Svar

Jag baserar mitt svar på @ÓlafurWaages funktion. Jag försökte använda det men stötte på referensproblem när jag försökte ändra det returnerade objektet. Jag har uppdaterat dess funktion för att skicka och returnera genom referens. Ny funktion:

Funktion &random_value(&$array, $default=null) ( $k = mt_rand(0, count($array) - 1); if (isset($array[$k])) (retur $array[$k]; ) else ( return $default; ) )

För att få ytterligare information se min fråga under Skicka/returnera referenser till ett objekt + att ändra ett objekt fungerar inte

$värde = $array;

Du kan använda array_rand-funktionen för att välja en slumpmässig nyckel från din array som nedan.

$array = array("en", "två", "tre", "fyra", "fem", "sex"); echo $array;

eller så kan du använda rand och räkna funktionerna för att välja ett slumpmässigt index.

$array = array("en", "två", "tre", "fyra", "fem", "sex"); echo $array;

$random = $ran;

Den är också användbar som funktion om du behöver ett värde.

Funktion random_value($array, $default=null) ( $k = mt_rand(0, count($array) - 1); return isset($array[$k])? $array[$k]: $default; )

Har ditt val några säkerhetskonsekvenser? Om så är fallet, använd random_int() och array_keys() . (random_bytes() är endast PHP 7, men det finns en polyfill för PHP 5).

Funktion random_index(array $source) ( $max = count($source) - 1; $r = random_int(0, $max); $k = array_keys($source); return $k[$r]; )

Ansökan:

$array = [ "apple" => 1234, "pojke" => 2345, "katt" => 3456, "hund" => 4567, "eko" => 5678, "fortune" => 6789 ]; $i = random_index($array); var_dump([$i, $array[$i]]);

Funktion array_random($array, $amount = 1) ( $keys = array_rand($array, $amount); if ($amount == 1) (retur $array[$keys]; ) $results = ; foreach ($keys som $key) ( $results = $array[$key]; ) returnerar $results; )

Ansökan:

$items = ["foo", "bar", "baz", "lorem"=>"ipsum"]; array_random($objekt); // "bar" array_random($items, 2); // ["foo", "ipsum"]

Några anteckningar:

  • $amount måste vara mindre än eller lika med count($array) .
  • array_rand() blandar inte nycklar (sedan PHP 5.2.10, se ), så elementen du väljer kommer alltid att vara i den ursprungliga ordningen. Använd shuffle() om det behövs.

redigera: Laravels funktion har vuxit märkbart sedan dess, se Laravel 5.4"s Arr::random() . Här är något lite mer komplext, som härrör från Laravels vuxna funktion:

Funktion array_random($array, $number = null) ( $requested = ($number === null) ? 1: $number; $count = count($array); if ($requested > $count) (kast ny \ RangeException("Du begärde ($requested) objekt, men det finns bara ($count) objekt tillgängliga."); ) if ($number === null) ( return $array; ) if ((int) $number == = 0) (retur; ) $keys = (array) array_rand($array, $number); $results = ; foreach ($keys som $key) ( $results = $array[$key]; ) return $results; )

Några höjdpunkter:

  • Kasta ett undantag om det inte finns tillräckligt med tillgängliga föremål
  • array_random($array, 1) returnerar en array med ett element (#19826)
  • Stödvärde "0" för antalet element (Det är bara rent och enkelt.

Jag har fått frågan ett par gånger hur jag gör slumpmässig utmatning av citat på din webbplats i blocket " Smarta citat". Vidare lyckades jag ta reda på att problemet här är ett missförstånd av människor, hur man får slumpmässigt element från array i php. Uppgiften är enkel, men ändå, eftersom frågor uppstår, är det nödvändigt att besvara dem.

Jag ger dig koden direkt. Låt oss säga att det finns en array med en uppsättning citattecken. Och du måste välja en slumpmässig av dem och skriva ut:

$quotes = array(); // Initiera en tom array
$quotes = "Var uppmärksam på dina tankar, de är början på handlingar."; // Första citatet
$quotes = "Det är inte de smartaste eller starkaste som överlever, utan de som är mest mottagliga för förändring."; // Andra citatet
$quotes = "Livet är ett berg: gå upp långsamt, gå ner snabbt."; // Tredje citatet
$quotes = "Människor vill inte bli rika, människor vill bli rikare än andra."; // Fjärde citatet
$number = mt_rand(0, count($quotes) - 1); // Ta ett slumptal från 0 till (arraylängd minus 1) inklusive
echo $quotes[$number]; // Output offert
?>

Nyckelpunkten är få ett slumpmässigt tal. Allt du behöver göra är att sätta rätt gränser. Om du behöver välja ett slumpmässigt element över hela längden av arrayen, är detta från 0 innan ( arraylängd minus 1). Och sedan bara dra element från array med givet slumpmässigt index.

När det gäller uppgiften med citat är det bättre att lagra dem i en databas. I princip, om webbplatsen är väldigt enkel, så kan du textfil. Men om den finns i en databas är den bättre att använda RAND() Och BEGRÄNSA V SQL-fråga så att du direkt får ett enda och slumpmässigt citat från databasen.

Slumptal är en integrerad del av programmering, speciellt när det kommer till säkerhetssystem. Till exempel bygger kryptografi på att generera slumpmässiga värden för att producera siffror som inte kan förutsägas. Naturligtvis, i PHP spelar slumptal en stor roll: med hjälp av dem kan vi generera tokens, salt och andra värden.

Generering av slumptal baseras på speciella algoritmer. Ingångsparametern från vilken algoritmen kommer att starta kan antingen vara ett slumpmässigt värde eller ett förutbestämt.

I den här artikeln kommer vi att prata om slumptal: hur de genereras och var de kan användas.

Använda slumpmässiga siffror

Slumptal spelar en stor roll i PHP, eftersom mycket ofta används för olika ändamål. I grund och botten är de relaterade till säkerhet. Baserat på dem genereras CSRF-tokens, API-nycklar, värden för autentisering, värden för att återställa lösenord och mycket mer. Allt detta görs för att göra det resulterande värdet omöjligt att förutse.

De viktigaste exemplen på att använda slumpmässiga värden är:

  • Saltgenerering för kryptografi- ett slumpmässigt saltnummer används, som regel, för envägskryptering, såväl som för att hasha lösenord. Detta slumpmässiga värde används som en initialiseringsvektor i kryptografi.
  • Genererar slumpmässiga värden som sessions-ID– PHP används för att skapa ett stort antal applikationer där säkerheten kommer först. Många funktioner bygger på att arbeta med sessioner och genererade sessions-ID:n.
  • Generering av autentiseringstokens som är nästan omöjliga att förutsäga- många PHP-applikationer bygger på att arbeta med andra system genom speciella API-gränssnitt. Vanligtvis, innan du använder API:t, måste du gå igenom autentiseringsprocessen. Att få svåra att gissa värden för tokens är väldigt svårt. Det är därför som slumptal används i dessa problem.

Slumptalsgeneratorer

De slumptal som används i de fall som beskrivs ovan genereras i PHP av pseudogeneratorer. Det finns flera algoritmer tillgängliga:

    Linjär kongruent metod när funktionen lcg_value() används.

    Mersenne vortex, som används av funktionen mt_rand().

    Rand()-funktionen, som använder en liknande funktion i C-språket.

Faktum är att dessa funktioner inte returnerar slumptal, utan siffror fördelade på ett sådant sätt att de ser ut som slumpmässiga. Sekvensen av dessa nummer beror på det underliggande slumptalet inom den implementerade algoritmen.

Basnummer för generatorer

Bastal eller vektorer för sådana tal är datamängder som används för att generera slumptal. Pseudo-slumptalsgeneratorer fungerar bara baserat på dem. Om en angripare känner till detta bastal, kommer han i framtiden att kunna förutsäga värdena för dina slumptal.

I PHP kan du ställa in bastal på två sätt. Den första använder funktionen mt_srand(). Denna metod används främst i enhetstester av en slumpmässig serie. Det andra sättet är att låta PHP generera bastalen själv. Från och med version 4.2 tillhandahåller PHP denna möjlighet. Därefter kommer Mersenne Vortex att användas för att generera slumpmässiga tal.

PHP genererar ett basnummer, beroende på operativ system. På Linux-plattformar kan du använda funktionerna mcrypt_create_iv() eller openssl_pseudo_random_bytes() i /dev/urandom. Windows tillhandahåller en speciell pseudogenerator som kan nås via openssl_pseudo_random_bytes() och mcrypt_create_iv() funktionerna.

Resultat

Eftersom slumptal spelar en stor roll för att bygga säkra webbapplikationer behöver vi veta mer om hur de fungerar. Om du själv vill generera bastal för pseudogeneratorer, se till att dina metoder är tillförlitliga.

rand(1,N) men exklusive array(a,b,c,..)

finns det redan en inbyggd funktion som jag inte känner till eller behöver jag implementera den själv (hur?)?

UPPDATERING

En kvalificerad lösning måste ha guld, oavsett om storleken på den uteslutna arrayen är stor eller inte.

Det finns ingen inbyggd funktion, men du du kan gör det:

Funktion randWithout($from, $to, array $exceptions) ( sort($exceptions); // låter oss använda break; i förgrunden tillförlitligt $number = rand($from, $to - count($exceptions)); / / eller mt_rand() foreach ($exceptions som $exception) ( if ($number >= $exception) ( $number++; // kompensera gapet ) else /*if ($number< $exception)*/ { break; } } return $number; }

Det finns inte i mitt huvud, så det skulle kunna behövas polish - men du kan åtminstone inte hamna i ett oändligt loop-scenario, inte ens hypotetiskt.

Notera: Funktionen avbryts om $undantag avgaser ditt räckvidd - om du till exempel anropar randWithout(1, 2, array(1,2)) eller randWithout(1, 2, array(0,1,2,3)) kommer inte att producera något rimligt (uppenbarligen), men i detta Om det returnerade numret ligger utanför $från - $to-intervallet, så det är lätt att fånga.

Om $exceptions garanterat redan är sorterade, sort($exceptions); kan tas bort.

ögongodis: något minimal visualisering av algoritmen.

Jag tror inte att det finns en sådan inbyggd funktion; du måste antagligen koda den själv.

För att koda detta har du två lösningar:

  • Använd en loop för att anropa rand() eller mt_rand() tills den returnerar rätt värde
    • vilket innebär att anropa rand() flera gånger, i värsta fall
    • men detta borde fungera bra om N är stort och du inte har många förbjudna värden.
  • Skapa en array som endast innehåller lagliga värden
    • Och använda array_rand för att välja ett värde från det
    • vilket kommer att fungera bra om N är litet

Beroende på vad du behöver och varför detta tillvägagångssätt kan vara ett intressant alternativ.

$numbers = array_diff(intervall(1, N), array(a, b, c)); // Antingen (inte ett riktigt svar, men kan vara användbart, beroende på dina omständigheter) shuffle($numbers); // $numbers är nu en slumpvis sorterad array som innehåller alla siffror som intresserar dig // Eller: $x = $numbers; // $x är nu ett slumpmässigt tal valt från den uppsättning siffror du är intresserad av

Så om du inte behöver generera en uppsättning potentiella siffror varje gång, utan generera en uppsättning en gång och sedan välja ett gäng slumpmässiga tal från samma uppsättning, kan detta vara en bra väg att gå.

Det enklaste sättet…

Du måste beräkna en array av saknade platser så att du kan välja en slumpmässig position i en sammanhängande array med längden M = N - antal undantag och enkelt mappa tillbaka den till den ursprungliga arrayen med hål. Detta kommer att kräva tid och utrymme lika med den passerade arrayen. Jag kan inte php från ett hål i marken, så ursäkta textexemplet som semi-psudo.

  1. Gör en ny Offset-array med samma längd som Exceptions-arrayen.
  2. i Offset lagrar [i] det första indexet i en imaginär icke-tom array som skulle missa i-element i den ursprungliga arrayen.
  3. Välj nu ett slumpmässigt element. Välj ett slumpmässigt tal, r , i 0..M antalet element kvar.
  4. Hitta i den offset[i]<= r < Offest это легко с бинарным поиском
  5. Returnera r + i

Nu, det här är bara en skiss, du kommer att behöva ta itu med ändarna på arrayerna, och om något är indexerat i form av 0 eller 1 och all den där jazzen. Om du är smart kan du faktiskt beräkna Offset-arrayen i farten från originalet, men det är lite mindre tydligt.

Kanske för sent för ett svar, men jag hittade den här kodbiten någonstans i mitt sinne när jag försökte få slumpmässiga data från en databas baserad på ett slumpmässigt id förutom ett nummer.

$excludedData = array(); // Detta är ditt uteslutna nummer $maxVal = $this->db->count_all_results("game_pertanyaan"); // Få det maximala antalet baserat på min databas $randomNum = rand(1, $maxVal); // Gör första initieringen, tror jag du kan lägg detta direkt i while > in_array paramater, verkar fungera också, det är upp till dig medan (in_array($randomNum, $excludedData)) ( $randomNum = rand(1, $maxVal); ) $randomNum; // Ditt slumptal exklusive något nummer du väljer

Om du upptäcker ett fel, välj en textbit och tryck på Ctrl + Retur
DELA MED SIG: