Visualizzazione dei risultati da 1 a 10 su 10

Discussione: [java] random()

  1. #1

    [java] random()

    allora, il mio programma fa partire una serie di threads contemporaneamente, e ad un certo punto del programma avviene la generazione di un numero casuale, al momento sto utilizzando random(), il problema é che se ho capito bene il numero é solo pseudorandom e a millisecondi uguali corrisponde un uguale numero generato. Ora volevo sapere quale fosse una buona soluzione, esiste un modo per generare numeri veramente casuali? Ho pensato che si potrebbe fare un delay di qualche millisecondo prima di generare, qualcuno mi puó suggerire come?
    Walk fast, chew slowly.
    "We used students as subjects because rats are expensive and you get too attached to them"

  2. #2
    il metodo random, se non ricordo male, in java ma anche in altri linguaggi, fornisce un numero di una sequenza di numeri pseudocasuale.
    Di default come seme prende il numero di millisecondi corrente (o comunque qualcosa legato al numero di millisecondi). Quindi se due thread allo stesso istante richiamano il metodo random otterrano lo stesso numero. Ma se lo stesso thread richiama due volte il metodo random() allora ottiene due numeri dversi, facenti parte di questa sequenza di numeri pseudocasuale.
    Io avevo risolto un problema analogo facendo così: mi ero creato una classe con nu metodo statico che mi restituiva il numero random. In tal modo i vari thread richiamavano sempre il metodo dello stesso oggetto, per cui ero sicuro di ottenere due numeri distinti della sequenza pseudocasuale.

  3. #3
    uhmmm...per ora anch'io ho un metodo statico che mi restituisce il numero, la differenza potrebbe essere che io richiamo il suddetto metodo dalla stessa classe in cui si trova il metodo, dici che metterlo in una classe diversa faccia la differenza?
    Walk fast, chew slowly.
    "We used students as subjects because rats are expensive and you get too attached to them"

  4. #4
    acciderbolina! purtroppo anche mettendola cosí:

    codice:
    class RandomMethods {
    
     static int getRandomInt(int variableLimit) {
      Random intGenerator = new Random();
      return intGenerator.nextInt(variableLimit);
     } //geRandomInt
    
    }
    niente, stesso risultato. Non é che per caso potresti spedirmi (se ce l'hai ancora) il tuo codice? Grazie in advance.
    Walk fast, chew slowly.
    "We used students as subjects because rats are expensive and you get too attached to them"

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,315
    E usare semplicemente il metodo statico: Math.random() no??




    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    ho capito ma il problema resta!
    Walk fast, chew slowly.
    "We used students as subjects because rats are expensive and you get too attached to them"

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,315
    Beh... se vuoi effettuare un delay di qualche millisecondo puoi usare il metodo (anche statico) di tutti i thread: sleep(long millis).

    Passi a questo metodo il numero di millisecondi da attendere (magari generato, proprio, tramite una chiamata a Math.random() )



    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    grazie, al time delay ci avevo pensato ma poi ho avuto la spiacevole sorpresa che numeri uguali venivano generati addirittura in un intervallo di dieci millisecondi. Al di sopra di dieci tutto ok. Inoltre i thread generano a loro volta piú di un numero casuale. Comunque poi per la cronaca ho risolto abbastanza semplicemente facendo:
    Random seedRandom = new Random();
    poi per ogni thread
    startThreadUsingRandomInstance(new Random(seedRandom.nextInt()));
    che poi non é troppo lontana dalla tua soluzione di reseeding basata sui millisecondi. Grazie mille per il supporto, alla prossima.
    Walk fast, chew slowly.
    "We used students as subjects because rats are expensive and you get too attached to them"

  9. #9
    poi, potresti sincronizzare la chiamata del metodo..
    Blink@go

    "Non tutto quel che è oro brilla, Ne gli erranti sono perduti; Il vecchio ch'è forte non s'aggrinza, Le radici profonde non gelano.Dalle ceneri rinascerà un fuoco, L'ombra sprigionerà una scintilla, Nuova sarà la lama ormai rotta, E re quei ch'è senza corona."

    ------------
    Lang: java 1.4.1 Eclipse

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,315
    Beh... si potrebbe anche ipotizzare una soluzione differente: se ogni thread avesse un numero univoco (un indice) potresti utilizzarlo per inizializzare il generatore di numeri casuali... numeri differenti = numeri pseudo-casuali differenti!

    Volendo avrei anche il codice di un generatore di nuperi pseudo-casuali migliore di quello di Java (dico migliore perchè così ha detto un professore di statistica).

    codice:
    public class RandomNumber {
       private double seed;
       private final long a = 16807;
       private final long m = 2147483647;
       private final long q = 127773;
       private final long r = 2836;
    
       public RandomNumber(double seed) {
          this.seed = seed;
       }
    
       public double getRandom() {
    
          double lo, hi, test;
    
          hi = seed / q;
          lo = seed - (q * hi);
          test = (a * lo) - (r * hi);
    
          if (test < 0.0) {
             seed = test + m;
          } else {
             seed = test;
          }
          return (seed / m);
       }
    
       public double getSeed() {
          return seed;
       }
    }
    Se si passa al costruttore un numero come per esempio l'indice del thread moltiplicato per una costante, questo genererà numeri diversi per thread diversi.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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 © 2025 vBulletin Solutions, Inc. All rights reserved.