Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1

    [algoritmi] combinazioni uniche di numeri casuali

    Ho una lista di oggetti che per essere inizializzati richiedono la generazione di quattro numeri interi ognuno incluso fra 1 e 999.
    Non conosco a priori la dimensione alla quale la lista può arrivare. A seconda di alcune considerazioni direi che ci possono essere situazioni in cui la lista conterrá decine di elementi, ed altre in cui potrebbe contenerne centinaia.
    Dovrei essere certo che ogni oggetto abbia una combinazione unica di quattro numeri, al momento sto facendo affidamento semplicemente sulla probabilitá che mi dice che una condizione simile è alquanto rara.
    codice:
    class item
    {
    int x,y,z,k;
    public bool operator==(item it)
    {
    return x==it.x && y==it.y && z==it.z && k==it.z;
    }
    }
    class container
    {
    private list<item> lista;
    public void init()
    {
    for(int i=0; i<lista.count;i++)
    {
    lista[i].x =random(1,999); //lo stesso per gli altri interi
    }
    }
    }
    ma per assicurarmi che ogni item sia davvero unico come potreifare?

    Perchè fare un controllo su ogni elemento creato mi sembra troppo inefficiente da un punto di vista computazionale quando ladimensione della lista crescetroppo. Stavo pensando se non potessi creareio i numeri in modo tale chesu 999 "tiri"(passatemi ili termine) non ricapiti mai due volte lo stesso.
    in questo modo sarei assolutamente certo che le sequenze siano uniche.

    Sono comunque aperto a qualsiasi suggerimento

  2. #2
    È necessario utilizzare una lista? Perché altrimenti basterebbe una hash-table con la chiave che corrisponde alla combinazione randomica, mentre il valore sarà l'oggetto da contenere.

  3. #3
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Wrappa la generazione del numero casuale in una classe custom (es.: CustomRandom) che si occupa di tenere traccia dei numeri già usciti.

    Il metodo che genererà il numero controllerà se il numero ottenuto è già stato generato: se è nuovo lo restituisce altrimenti continua a generare finché non ne trova uno valido.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Quote Originariamente inviata da Alex'87 Visualizza il messaggio
    Wrappa la generazione del numero casuale in una classe custom (es.: CustomRandom) che si occupa di tenere traccia dei numeri già usciti.

    Il metodo che genererà il numero controllerà se il numero ottenuto è già stato generato: se è nuovo lo restituisce altrimenti continua a generare finché non ne trova uno valido.
    Non è il numero a dover essere unico, ma la combinazione di 3 numeri, certo che come approccio può funzionare comunque, mi chiedo se non ci sia qualcosa di più efficiente
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Potresti utilizzare un array popolato con numeri distinti , per es un array di nome Ar con indici da 1 a 999, e
    procedere estraendo casualmente gli indici come segue;

    - alla prima estrazione consideri il range di indici da 1 a 999 e supponiamo esca il 10;
    Ar(10) è il primo numero estratto che scambi di posto con Ar(999)

    - alla seconda estrazione consideri il range di indici da 1 a 998 (così sei sicuro di escludere quello già estratto)
    e supponiamo esca ancora il 10;
    Ar(10) è il secondo numero estratto che scambi di posto con Ar(998)

    ... e così via fino alla fine .

    Al termine avrai in Ar i numeri causali e distinti con il primo estratto all'ultimo indice, il secondo estratto al penultimo etc...

    HTH
    HTH

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Quote Originariamente inviata da sspintux Visualizza il messaggio
    Potresti utilizzare un array popolato con numeri distinti , per es un array di nome Ar con indici da 1 a 999, e
    procedere estraendo casualmente gli indici come segue;

    - alla prima estrazione consideri il range di indici da 1 a 999 e supponiamo esca il 10;
    Ar(10) è il primo numero estratto che scambi di posto con Ar(999)

    - alla seconda estrazione consideri il range di indici da 1 a 998 (così sei sicuro di escludere quello già estratto)
    e supponiamo esca ancora il 10;
    Ar(10) è il secondo numero estratto che scambi di posto con Ar(998)

    ... e così via fino alla fine .

    Al termine avrai in Ar i numeri causali e distinti con il primo estratto all'ultimo indice, il secondo estratto al penultimo etc...

    HTH
    HTH
    Ci avevo pensato anch'io, ma si parla di quadruple uniche, che sarebbe un 999^4 numero di quadruple uniche....

    Edit: approssimativamente 7,25 TB con interi a 2 bytes
    Ultima modifica di Scara95; 02-01-2014 a 22:35
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    Non è il numero a dover essere unico, ma la combinazione di 3 numeri, certo che come approccio può funzionare comunque, mi chiedo se non ci sia qualcosa di più efficiente
    Sorry avevo letto di fretta ^^'
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  8. #8
    Buona l'idea dei vettori ci lavoro su e vi faccio sapere. Devo trasformarla in modo che lavori su una combinazione di 4 numeri

  9. #9
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Quote Originariamente inviata da MegaAlchimista Visualizza il messaggio
    Buona l'idea dei vettori ci lavoro su e vi faccio sapere. Devo trasformarla in modo che lavori su una combinazione di 4 numeri
    L'algoritmo è esattamente lo stesso perché non fa altro che rimescolare, solo che, come dicevo sotto, ti servirebbe l'array intero di quadruple che, se assumiamo una dimensione di 2 bytes ad intero, occupano una memoria di 999^4 * (4*2) bytes, che sono circa 7,25 TB

    Edit: assumendo che l'ordine dei numeri sia rilevante, altrimenti il numero si riduce, ma resta comunque troppo grande
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  10. #10
    Hai ragione scara. Comunque no... L'ordine non è importante.
    penso che mi accontenterò di far si che ogni numero non si ripeta mai, mi sembra un buon compromesso?
    Farò quattro vettori di size 999 ed estrarrò ogni intero dal corrispondente vettore
    Ultima modifica di MegaAlchimista; 02-01-2014 a 23:42 Motivo: aggiunta

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.