Qual è la differenza tra _Procedural Generation_ e _Random Generation_?

5

Oggi sono entrato in discussione sul termine "generazione procedurale".

Il mio punto era che il suo diverso dalla generazione casuale "classica" in quella generazione procedurale si basa su un algoritmo più matematico, basato su frattali che porta a una distribuzione più "realistica" e alla solita casualità della maggior parte delle lingue si basa su un generatore di numeri pseudo-casuali, che porta a una distribuzione "non realistica", in un certo senso, brutta. Questa discussione è stata fatta con una mappa delle altezze in mente.

La discussione mi ha lasciato in qualche modo poco convinto riguardo ai miei argomenti, quindi, c'è dell'altro? O sono io quello che è, in effetti, semplicemente sbagliato?

    
posta U-No-Poo 19.12.2012 - 11:10
fonte

5 risposte

8

Penso che tu abbia torto. Procedurale non è l'opposto di random ; procedurale è l'opposto di handmade .

its different from "classic" random generation in the way that procedural is based on a more mathematical, fractal based, algorithm leading to a more "realistic" distribution and the usual randomness of most languages are based on a pseudo-random-number generator, leading to an "unrealistic", in a way, ugly, distribution.

Entrambi degli schemi che stai descrivendo qui sono procedurali. Il primo è discutibilmente migliore , più sofisticato , ma entrambi:

  • prendi un piccolo input (il seme );
  • usa quel seme e nient'altro , insieme a un processo algoritmico, per produrre l'output

Ora, potrebbe essere che quando le persone parlano di generazione procedurale, di solito parlano di schemi di generazione complicati basati su algoritmi accuratamente rifiniti - ma sono ancora random percepisci che l'input è una variazione casuale.

Il "non realistico", in un certo senso, brutto, la distribuzione [s] "hai menzionato? Anche quelli procedurali - solo utilizzando uno schema procedurale di generazione relativamente non sofisticato .

    
risposta data 19.12.2012 - 13:26
fonte
2

Prima di tutto, tutto un computer è per definizione pseudo-casuale, a meno che non sia effettivamente collegato a un dispositivo di conteggio della radioattività o qualcosa di simile. Non importa se usi i sistemi iterativi frattali, le equazioni lineari o qualsiasi altra cosa - lo stesso seme produrrà la stessa sequenza (e ciò è spesso buono, ad esempio per creare suite di test compatibili).

Certamente ci sono algoritmi buoni e cattivi per produrre sequenze casuali da computer, ma la definizione di ciò che è "realistico" (molto meno "brutto") non è affatto incontrovertibile. Come esempio di base, ci si aspetterebbe ingenuamente una serie casuale di cifre binarie per avere uguali quantità di valori 0 e 1, ma in realtà questa definizione renderebbe completamente prevedibile ogni altro elemento e la sequenza risultante molto, molto prevedibile.

Le sequenze casuali effettive di cifre binarie tendono ad avere quantità approssimativamente uguali di 0 e 1 e il rapporto tende ad avvicinarsi a 0,5 man mano che la sequenza cresce, ma il assoluto numero di 0 e 1 è in realtà più rischia di diventare più diseguale nel tempo. (Ottenere esattamente 500.000 0 e 500.000 1 da un milione di cifre casuali è abbastanza improbabile.) Quindi vedi che la definizione di "casuale" è piuttosto più complicata che solo "imprevedibile" o "uniformemente distribuita", e non c'è un consenso totale su quale dovrebbe essere la definizione o quali proprietà delle sequenze sono effettivamente necessarie per un determinato compito. Non sono sicuro quale di queste proprietà possa essere migliorata con i generatori di frattali rispetto ai generatori congruenziali lineari standard, ma mi aspetto che le persone più esperte pubblichino qualcosa.

    
risposta data 19.12.2012 - 11:23
fonte
2

Permettetemi di aggiungere alla discussione che la differenza tra "casuale" e "deterministico" è, nel mondo reale, una pura questione di percezione soggettiva. - Come hai detto tu: alcune soluzioni producono risultati "brutti" mentre altri no.

Nel mondo a cui mi riferisco, la differenza effettiva tra "casuale" e non casuale è fondamentalmente solo, se l'osservatore umano è in grado di riconoscere un modello nell'output generato, come qualche schema ricorrente o qualche altro aspetto che gli faccia capire quale potrebbe essere l'output probabilmente in una delle prossime iterazioni. La capacità di riconoscere un determinato pattern dipende ovviamente molto dal contesto dell'osservatore: alcune persone potrebbero non riuscire a vedere il pattern dietro la sequenza 2, 3, 5, 7, 9, 11, 13, 17, 19, 23, 29 , mentre è probabile che gli altri lo rilevino rapidamente.

Pertanto, ogni PRNG a buon mercato può facilmente far credere all'osservatore / utente che il suo output sia davvero casuale. - Oppure, mettilo in un altro modo: ogni volta che l'osservatore non riesce a riconoscere la correlazione causa-conseguenza (o input-output) in un sistema, le sue osservazioni appariranno come puramente casuali per lui.

Come la vedo io, la domanda diventa:

  1. Quanto complesso dovrebbe essere l'algoritmo per "ingannare" l'osservatore (previsto)? e
  2. Come modellare l'output in un modo che, pur rimanendo percepito in modo casuale, crea la percezione desiderata "realistica" o "non brutta". - Questo potrebbe anche riguardare l'estetica. Gli algoritmi frattali spesso sono bravi in questo, perché la loro produzione assomiglia strutturalmente all'immagine dell'osservatore del mondo reale.
risposta data 19.12.2012 - 19:29
fonte
1

generazione procedurale significa che c'è un seme che definisce tutto l'output e non importa quante volte si rigenera con lo stesso seme si ottiene lo stesso output ogni volta, che si vede usato ad esempio in minecraft e strongzza nana

la generazione casuale vera richiede un'entrata extra esterna da aggiungere al seme iniziale, quindi ogni volta che viene eseguito ottieni un output diverso

è importante notare che entrambi gli approcci possono generare sia una buona che una cattiva generazione

Generatori casuali di psuedo usati per questo sono generatori congruenziali lineari e mercenne twisters , ognuno dei quali può essere sufficiente se usato correttamente

per esempio minecraft usa un LCG (come nello standard azionario di java Casuale implementazione) per la sua generazione di mappe

    
risposta data 19.12.2012 - 13:13
fonte
0

La principale differenza tra generazione procedurale e generazione pseudo-casuale è che i numeri generati da un algoritmo procedurale di generazione (come un frattale) dovrebbero avere alcune relazioni preimpostate mentre i numeri pseudo-casuali dovrebbero simulare processi veramente casuali.

Nota: questa risposta è basata sulla definizione di Wikipedia di generazione procedurale

    
risposta data 20.12.2012 - 01:59
fonte

Leggi altre domande sui tag