Vai al contenuto
ciccio

Combinazione Random

Recommended Posts

ciao raga, sto cercando orami da qualche giorno il modo di disporre lungo una dimensione una serie di oggetti in modo da avere colori diversi , e fin qui tutt ok

delete objects

function riga_1d =(

for i=0 to 10 do

(

colorewire_r = random 0 255

colorewire_g = random 100 255

colorewire_b = random 0 255

mybox = box()

mybox.wirecolor = [colorewire_r,colorewire_g,0]

mybox.pos = [i*25,0,0]

)

)

riga_1d() [0,0,0]

)

il problema si pone quando a questa serie di cubi vorrei cambiare la posizione senza avere sovrapposizioni

select $*

num_cubi = $box*.count

for obj in selection do

(

ranx = random 0 num_cubi

mybox = obj

mybox.pos = [ranx * 25,0,0]

)

il fatto è che alcuni cubi si dispongono nelle stesse coordinate a causa del ripetersi del valore random.

avete suggerimenti????

stavo pensando di usare qualcosa come le permutazioni di oggetti per risolvere, pero' so già che la soluzione è molto semplice.....e non vorrei incasinare troppo.

ciao grazie

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
avete suggerimenti????

stavo pensando di usare qualcosa come le permutazioni di oggetti per risolvere, pero' so già che la soluzione è molto semplice.....e non vorrei incasinare troppo.

ciao grazie

se la soluzione è semplice perchè dovrebbe incasinare? :P

comunque col random se tu vuoi ottenere 7 valori casuali e tu gli dici che i valori devono essere compresi tra 0 e 7 è abbastanza normale che ci siano delle sovrapposizioni.

io creerei un vettore con i numeri possibili, poi ogni volta che vuoi un numero col random selezioni un indice a caso e prendi il numero corrispondente(rimuovendolo poi dal vettore) in questo modo non avrai sovrapposizioni

oppure crei il vettore, fai scambi a caso tra i suoi elementi e poi assegni le posizioni.

fammi sapere

ciao!

P.S. ti suggerisco di tenere il codice un pò più leggibile.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

quello che intendevo era questo:

--CREO LA STRUCT CHE MI GESTIRA' I NUMERI CASUALI

struct numeriCasuali(

	vetNumeri=#(),--VETTORE DOVE TERRO' I NUMERI

	numMax=0,--NUMERO DEI NUMERI POSSIBILI

	--CON QUESTA FUNZIONE INIZIALIZZO IL VETTORE NUMERI

	fn inizializza quanti:numMax=(

		numMax=quanti

		vetNumeri=for i=1 to numMax collect i

	),

	--QUESTA FUNZIONE RESTITUISCE IL NUMERO CASUALE IN MODO CHE NON CI SIANO

	--RIPETIZIONI

	fn getNum=(

		--QUESTO CONTROLLO C'è NEL CASO CHE VENGANO RICHIESTI PIU'

		--NUMERI DI QUELLI CHE C'ERANO(REINIZIALIZZO IL VETTORE)

		if vetNumeri.count==0 then inizializza()


		--CALCOLO L'INDICE CASUALE

		indice=random 1 (vetNumeri.count)

		--SALVO IL NUMERO CORRISPONDENTE ALL'INDICE CALCOLATO

		risultato=vetNumeri[indice]

		--ELIMINO IL NUMERO DAL VETTORE vetNumeri

		deleteItem vetNumeri indice

		--RESTITUISCO IL RISULTATO

		return risultato

	)

)

--CREO LA VARIABILE PROVA TI TIPO DELLA STRUCT DEFINITA SOPRA

prova=numeriCasuali()

--STAMPO A VIDEO NUMMAX(0)

prova.numMax

--INIZIALIZZO IL VETTORE DEI NUMERI, IN QUESTO CASO VOGLIO SEI NUMERI POSSIBILI

prova.inizializza quanti:6

--STAMPO A VIDEO NUMMAX(6)

prova.numMax


--GENERO CINQUE NUMERI CASUALI USANDO LA FUNZIONE getNum DELLA STRUCT

for i=1 to 5 do

(

	format "numero ottenuto:%\n" (prova.getNum())

)


--NON HO RIPETIZIONI

se hai domande sono qua.

ciao!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

di nulla!

non l'ho testato al 100% e quindi potrebbe avere qualche bug, non prenderlo come oro colato!!!!

ciao


Modificato da coren

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

sti giorni ci lavoro un po' su... in linea di principio funziona, lo adatto un po' e appena ne esce fuori qualcosa ti faccio sapere..non mi interessa l'esattezza formale dello script ma il suo funzionamento per imparare a scriverne di più complessi, dato che come avrai ben capito sono del tutto nuovo in materia..grazie ancora ciao

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

dunque se ho capito bene la STRUCT mi permette di creare una nuova classe di oggetti e funzioni utili nel determinare il numero random senza ripetizioni( che tu chiami dopo averlo convertito in una variabile PROVA).

ho fatto un tentativo nell'adattare il tuo script alla trasformazione della posizioni dei cubi sulla scena in base al numero di posizione presente in un vettore pescato a caso senza ripetizione.

ci sono degli errori relativi al non aver capito delle cose(tanto è vero che mi da errore),percui non l'ho usate, ad esempio

l'utilità

-della variabile QUANTI nella fn inizzializza

-di if vetNumeri.count==0 then inizializza() nella fn getnum

l'errore che ottengo è questo:

OK
11
#Struct:posizioniCasuali(
inizializza:<fn>,
vetPosizioni:<data>,
getNum:<fn>)
posizioniCasuali vetPosizioni:#()
-- Unknown property: "combMax" in posizioniCasuali vetPosizioni:#()
-- Unable to convert: undefined to type: Integer
OK
[/codebox]

nella scena sono presenti 11 box di 25 unità di dimensione

[codebox]select $box* -- seleziono tutti i box nella scena
num_cubi = $box*.count --numero di cubi presenti sulla scena

--creo la struct che gestirà le posizioni casuali
struct posizioniCasuali(

vetPosizioni=#(), --vettore dove terro' le posizioni

fn inizializza =( --inizializzo il vettore posizioni
combMax=num_cubi --numero di combinazioni possibili=numero cubi
vetPosizioni=for i=1 to combMax collect i*25 --creo un vettore che contenga le posizioni
),

fn getNum=( --numero casuale senza ripetizioni



indice=random 1 (vetPosizioni.count)
risultato= vetPosizioni[indice]
deleteItem vetPosizioni indice
return risultato
)
)--fine della struct

--creo la variabile di prova di tipo della della struct
prova=posizioniCasuali()

prova.combMax--stampo a video le combinazioni massime

for i=1 to combMax do
(

format "numero ottenuto:%\n" (prova.getNum())
-- a questo punto potrei aggiungere qualcosa che per ogni cubo mi dia
-- miocubo.pos [prova.getNum(),0,0]
)

qualcosa non funziona in combmax ma non capisco esattamente cosa,ad ogni modo credo che grossso modo sia un inizio.

il passo successivo è quello di fare in modo che per ogni box0* faccia cambi le coordinate sull'asse x con getNum()...

ciao grazie :)

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

con struct definisci una struttura e tutto quello che è dentro le parentesi tonde dopo struct <nome struct> fa parte della sua definizione e non è una variabile.

quando nel mio esempio ho scritto

prova=posizioniCasuali()
ho creato una variabile del tipo posizioniCasuali che è il nome della sctruct che ho definito. all'interno della struct è possibile metterci di tutto, da variabili a funzioni. Nel mio caso ho creato la struct per gestire la generazione di numeri casuali ed avere una cosa 'chiusa' fine a se stessa(le funzioni definite al suo interno lavorano solo su dati della struct o che tu gli passi) nel mio esempio la struct era definita così:
struct numeriCasuali(

	vetNumeri=#(),--VETTORE DOVE TERRO' I NUMERI

	numMax=0,--NUMERO DEI NUMERI POSSIBILI

	fn inizializza quanti:numMax=(

	   .

	   .

	),

	fn getNum=(

	  .

	  .

	)

)
quindi era composta da quattro elementi: vetNumeri,numMax,inizializza(),getNum() tu hai convertito 'vetNumeri' in 'vetPosizioni' e 'numMax' in 'combMax'. solo che poi hai tolto 'combMax' dalla definizione della struct. lasciandone l'inizializzazione all'interno della funzione inizializza() nella quale viene definito, ma poi una volta eseguita la funzione viene rimosso dalla memoria. prova ad eseguire questo script:
a=10



(

b=5

)


format"il valore di a è:%\n"a

format"il valore di b è:%\n"b
la prima volta che lo esegui nel listener vedrai questo:
10

5

il valore di a è:10

OK

il valore di b è:undefined

OK

OK
questo perchè b viene definito all'interno delle parentesi lo vedi finchè sei all'interno delle parentesi ma una volta uscito dalle parentesi non lo vedi più; è la stessa cosa che succede se definisci una variabile all'interno di una funzione. prova ad eseguire una seconda volta questo codice e vedrai che questa volta il risultato sarà:
10

5

il valore di a è:10

OK

il valore di b è:5

OK

OK
perchè questa volta b non è undefined ed ha il valore 5 che gli è stato assegnato all'interno delle parentesi? perchè durante la prima esecuzione l'istruzione format in cui lo script vuole scrivere il valore di b non lo trova e scrive undefined, ma al tempo stesso crea la variabile b, assegnandogli undefined. eseguendolo una seconda volta quando esegue l'istruzione 'b=5' all'interno delle parentesi maxscript prima guarda se esiste una variabile di nome b e trovandola gli assegna 5, se non l'avesse trovata(come nel caso della prima esecuzione) ne avrebbe creata una, ma che esisterebbe solo durante l'esecuzione del codice all'interno delle parentesi. tornando al tuo codice ad un certo punto hai scritto
prova.combMax
non trovando all'interno di prova(che è la nostra struct) combMax allora ti dà errore; per correggere la cosa devi rimettere la sua definizione all'interno della struct. l'altro errore che c'è è nel ciclo for:
for i=1 to combMax do

(


format "numero ottenuto:%\n" (prova.getNum())

-- a questo punto potrei aggiungere qualcosa che per ogni cubo mi dia

-- miocubo.pos [prova.getNum(),0,0]

)

qui ti riferisci a 'combMax' come variabile, ma non esiste, perchè è interno a prova.

quindi devi scrivere 'prova.combMax' e vedrai che non ti darà più errore.

però non funziona ancora, questo perchè hai tolto il richiamo alla funzione 'inizializza()' che prepara la struct per la generazione dei numeri.

spero di essere stato chiaro.

ciao!


Modificato da coren

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

si iniziano a chiarire molte cose, soprattutto come if vetPosizioni.count==0 then inizializza() inizzializzi il vettore con le posizioni, e senza di lui non c'è modo di far memorizzare il vettore con le posizioni..che figata!!

con le dovute correzioni questo è il nuovo script, che per dare errore non ne da, ma convertendo i $box* as array e aggiungendo al for loop finale move mieicubi [prova.getnum,0,0], mi sposta tutti i cubi in maniera apparentemente casuale...

select $box* -- seleziono tutti i box nella scena

num_cubi = $box*.count--numero di cubi presenti sulla scena

mieicubi=$box* as array


--creo la struct che gestirà le posizioni casuali

struct posizioniCasuali(

vetPosizioni=#(), --vettore dove terro' le posizioni

combMax=num_cubi, --numero di combinazioni possibili=numero cubi
fn inizializza quanti:combMax =( --inizializzo il vettore posizioni
combMax=quanti
vetPosizioni=for i=1 to combMax collect i*25 --creo un vettore che contenga le posizioni
),

fn getNum=( --numero casuale senza ripetizioni
if vetPosizioni.count==0 then inizializza()



indice=random 1 (vetPosizioni.count)
risultato= vetPosizioni[indice]
deleteItem vetPosizioni indice
return risultato
)
)--fine della struct

--creo la variabile di prova di tipo della della struct
prova=posizioniCasuali()

prova.combMax--stampo a video le combinazioni massime
prova.inizializza
for i=1 to prova.combMax do
(

format "numero ottenuto:%\n" (prova.getNum())
-- a questo punto potrei aggiungere qualcosa che per ogni cubo mi dia
-- miocubo.pos [ prova.getNum(),0,0]

move mieicubi[i] [prova.getNum(),0,0] --muovo OGNI elemento di mieicubi di prova.getnum sull asse x
)
[/codebox]

grazie per la tua disponibilità!:D

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

rieccomi qui! dopo qualche giorno senza aver migliorato di molto lo script, anzi direi che l'ho proprio peggiorato <_< ! sono sicuro che la soluzione sarà prorpio una cazzata, ma non riesco a capire come mai aggiungendo all'ultimo for loop

" mieicubi.pos = [prova.getNum(),0,0]" anzichè spotarmi i cubi uno per uno secondo getnum() sull'asse x, i cubi vengono si spostati ma alla fine riappare il problema iniziale: i valori random si ripetono.

ho pensato che il problema che la funzione di muovere i cubi dovesse agire all'interno della struct, ma non ho avuto gran risultati.

select $box* -- seleziono tutti i box nella scena

num_cubi = $box*.count--numero di cubi presenti sulla scena

mieicubi=$box* as array


--creo la struct che gestirà le posizioni casuali

struct posizioniCasuali(

vetPosizioni=#(), --vettore dove terro' le posizioni

combMax=num_cubi, --numero di combinazioni possibili=numero cubi
fn inizializza quanti:combMax =( --inizializzo il vettore posizioni
combMax=quanti
vetPosizioni=for i=1 to combMax collect i*25 --creo un vettore che contenga le posizioni
),

fn getNum=( --numero casuale senza ripetizioni
if vetPosizioni.count==0 then inizializza()



indice=random 1 (vetPosizioni.count)
risultato= vetPosizioni[indice]
deleteItem vetPosizioni indice
return risultato
)
)--fine della struct

--creo la variabile di prova di tipo della della struct
prova=posizioniCasuali()

prova.combMax--stampo a video le combinazioni massime
prova.inizializza
for i=1 to mieicubi.count do
(

format "numero ottenuto:%\n" (prova.getNum())
-- a questo punto potrei aggiungere qualcosa che per ogni cubo mi dia
-- miocubo.pos [ prova.getNum(),0,0]

mieicubi[i].pos = [prova.getNum(),0,0]
)
[/codebox]

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

la struct che ho creato crea i numeri senza ripetizioni, ma se tu dai la possibilità di creare ad esempio 10 numeri e poi richiami getNum() 11 volte la struct reinizializza il tutto e riparte dall'inizio e quindi ottieni le ripetizioni.

controlla il numero delle box col numero di posizioni possibili.

ciao!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

format "numero ottenuto:%\n" (prova.getNum())

e

move mieicubi [prova.getNum(),0,0]

chiamo due volte la funzione getnum!! :wallbash: eheh

ad ogni modo questo è lo script sicuramente incompleto ma funzionante!


select $box* -- seleziono tutti i box nella scena

num_cubi = $box*.count--numero di cubi presenti sulla scena

mieicubi=$box* as array


--creo la struct che gestirà le posizioni casuali

struct posizioniCasuali(

vetPosizioni=#(), --vettore dove terro' le posizioni

combMax=num_cubi, --numero di combinazioni possibili=numero cubi
fn inizializza =( --inizializzo il vettore posizioni

vetPosizioni=for i=1 to combMax collect i*25 --creo un vettore che contenga le posizioni
),

fn getNum=( --numero casuale senza ripetizioni
if vetPosizioni.count==0 then inizializza() --senza questa parte il vetposizioni non inizzializza



indice=random 1 (vetPosizioni.count)
risultato= vetPosizioni[indice] --indice del vettore da cancellare
deleteItem vetPosizioni indice --cancellazione dell'elemento di vetposizioni
print"---indice del vettoreposizione ---"
print indice

return risultato
)
)--fine della struct

--creo la variabile di prova di tipo della della struct
prova=posizioniCasuali()

prova.combMax--stampo a video il numero dei cubi
prova.inizializza --inizializzo il vetposizioni

for i=1 to num_cubi do --do inizio alla sequenza di numeri random senza ripetizioni
(

newposx= prova.getNum()

mieicubi[i].pos = [newposx,0,0]

print "----posizione casuale----" --informazioni sulla posizione casuale e sulle nuove coordinate
print newpos
print "----posizione---"
print mieicubi[i].pos
)
[/codebox]

grazie ancora coren il tuo aiuto è stato indispensabile!! :D

;) bella!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora

  • Navigazione recente   0 utenti

    Non ci sono utenti registrati da visualizzare in questa pagina.

×