Is een functie die Math.random() puur aanroept?

Is het volgende een pure functie?

function test(min,max) {
   return  Math.random() * (max - min) + min;
}

Ik heb begrepen dat een pure functie aan deze voorwaarden voldoet:

  1. Het retourneert een waarde berekend op basis van de parameters
  2. Het doet geen ander werk dan het berekenen van de retourwaarde

Als deze definitie correct is, is mijn functie dan een pure functie? Of is mijn begrip van wat een pure functie definieert onjuist?


Antwoord 1, autoriteit 100%

Nee, dat is het niet. Gegeven dezelfde invoer, zal deze functie verschillende waarden retourneren. En dan kun je geen ‘tabel’ bouwen die de input en de output in kaart brengt.

Uit het Wikipedia-artikel voor Pure-functie:

De functie evalueert altijd dezelfde resultaatwaarde gegeven hetzelfde
argumentwaarde(n). De resultaatwaarde van de functie kan niet afhankelijk zijn van een
verborgen informatie of status die kan veranderen tijdens de uitvoering van het programma
opbrengsten of tussen verschillende uitvoeringen van het programma, noch kan het
afhankelijk zijn van externe invoer van I/O-apparaten

Een ander ding is ook dat een pure functie kan worden vervangen door een tabel die de toewijzing van de invoer en uitvoer weergeeft, zoals uitgelegd in deze thread.

Als je deze functie wilt herschrijven en veranderen in een pure functie, moet je de willekeurige waarde ook als argument doorgeven

function test(random, min, max) {
   return random * (max - min) + min;
}

en noem het dan op deze manier (bijvoorbeeld met 2 en 5 als min en max):

test( Math.random(), 2, 5)

Antwoord 2, autoriteit 28%

Het simpele antwoord op uw vraag is dat Math.random()regel 2 schendt.

Veel andere antwoorden hier hebben erop gewezen dat de aanwezigheid van Math.random()betekent dat deze functie niet zuiver is. Maar ik denk dat het de moeite waard is om te zeggen waaromMath.random()functies bezoedelt die het gebruiken.

Zoals alle pseudowillekeurige nummergeneratoren, begint Math.random()met een “seed” -waarde. Het gebruikt die waarde vervolgens als het startpunt voor een reeks bitmanipulaties op laag niveau of andere bewerkingen die resulteren in een onvoorspelbare (maar niet echt willekeurige) uitvoer.

In JavaScript is het betrokken proces implementatie-afhankelijk en in tegenstelling tot veel andere talen biedt JavaScript geen manier om de seed te selecteren:

De implementatie selecteert de initiële seed voor het algoritme voor het genereren van willekeurige getallen; het kan niet worden gekozen of gereset door de gebruiker.

Daarom is deze functie niet puur: JavaScript gebruikt in wezen een impliciete functieparameter waar je geen controle over hebt. Het leest die parameter uit gegevens die elders zijn berekend en opgeslagen, en schendt daarom regel #2 in uw definitie.

Als je hier een pure functie van wilt maken, kun je een van de alternatieve generatoren voor willekeurige getallen gebruiken die worden beschreven hier. Noem die generator seedable_random. Het neemt één parameter (de seed) en retourneert een “willekeurig” getal. Natuurlijk is dit aantal helemaal niet willekeurig; het wordt op unieke wijze bepaald door het zaad. Daarom is dit een pure functie. De uitvoer van seedable_randomis alleen “willekeurig” in die zin dat het voorspellen van de uitvoer op basis van de invoer moeilijk is.

De pure versie van deze functie zou drieparameters moeten hebben:

function test(min, max, seed) {
   return  seedable_random(seed) * (max - min) + min;
}

Voor elk gegeven triple van (min, max, seed)parameters, zal dit altijd hetzelfde resultaat opleveren.

Merk op dat als je wilt dat de uitvoer van seedable_randomechtwillekeurig is, je een manier moet vinden om de seed willekeurig te maken! En welke strategie je ook gebruikte, het zou onvermijdelijk niet-puur zijn, omdat je informatie zou moeten verzamelen van een bron buiten je functie. Als mtraceuren jpmc26herinner me, dit omvat alle fysieke benaderingen: hardware random number generators, webcams met lensdoppen, atmosferische ruis verzamelaars— zelfs lavalampen. Al deze omvatten het gebruik van gegevens die buiten de functie zijn berekend en opgeslagen.


Antwoord 3, autoriteit 21%

Een pure functie is een functie waarbij de retourwaarde alleen wordt bepaald door de invoerwaarden, zonder waarneembare bijwerkingen

Door Math.random te gebruiken, bepaalt u de waarde ervan door iets anders dan invoerwaarden. Het is geen pure functie.

bron


Antwoord 4, autoriteit 13%

Nee, het is geen pure functie omdat de uitvoer niet alleenafhangt van de geleverde invoer (Math.random() kan elke waarde uitvoeren), terwijl pure functies altijd de dezelfde waarde voor dezelfde invoer.

Als een functie puur is, is het veilig om meerdere oproepen met dezelfde invoer te optimaliseren en gewoon het resultaat van een eerdere oproep opnieuw te gebruiken.

P.S. voor mij in ieder geval en voor vele anderen heeft redux de term pure functiepopulair gemaakt. Rechtstreeks uit de redux-documenten:

Dingen die u nooit in een verloopstuk moet doen:

  • De argumenten muteren;

  • Voer neveneffecten uit zoals API-aanroepen en routeringsovergangen;

  • Niet-zuivere functies oproepen, bijv. Date.now() of Math.random().


Antwoord 5, autoriteit 10%

Vanuit wiskundig oogpunt is uw handtekening dat niet

test: <number, number> -> <number>

maar

test: <environment, number, number> -> <environment, number>

waar de environmentresultaten van Math.random()kan leveren.
En eigenlijk het genereren van de willekeurige waarde muteert de omgeving als bijwerking, dus je retourneert ook een nieuwe omgeving, die niet gelijk is aan de eerste!

Met andere woorden, als je enige vorm van invoer nodig hebt die niet afkomstig is van initiële argumenten (het <number, number>deel), dan moet je voorzien worden van een uitvoeringsomgeving (die geeft in dit voorbeeld de status voor Math). Hetzelfde geldt voor andere dingen die in andere antwoorden worden genoemd, zoals I/O of iets dergelijks.


Als analogie kun je ook opmerken dat dit is hoe objectgeoriënteerd programmeren kan worden weergegeven – als we bijvoorbeeld zeggen

SomeClass something
T result = something.foo(x, y)

dan gebruiken we eigenlijk

foo: <something: SomeClass, x: Object, y: Object> -> <SomeClass, T>

Met het object dat de methode heeft ingeroepen om deel uit te maken van het milieu. En waarom de SomeClasseen deel van het resultaat? Omdat something‘s staat kan veranderen!


6, Autoriteit 6%

Pure-functies retourneren altijd dezelfde waarde voor dezelfde invoer.
Pure-functies zijn voorspelbaar en zijn referentiaal transparant, wat betekent dat we de functie-oproep kunnen vervangen door de geretourneerde uitvoer en het zal de werking van het programma niet wijzigen.

https://github.com/HodlylyAlyadequate/housty -Antquate-gids / blob / master / ch3.md

Other episodes