génération de nombres aléatoires en java

Je veux créer 30 tableaux qui se compose des champs suivants. Par exemple,

Service_id   Service_Type     consumer_feedback 
  75           Computing        1                 
  35           imprimante          0                 
  33           imprimante         -1                
3 lignes dans le jeu (0.00 secondes)
MySQL > select * de consumer2 ;
Service_id   Service_Type     consumer_feedback   
  42           données             0
  75           computing        0
MySQL > select * de consumer3 ;
Service_id   Service_Type     consumer_feedback 
  43           données            -1
  41           données             1 
  72           informatique       -1

Comme vous pouvez le déduire de tableaux ci-dessus, je reçois les valeurs de retour. J'ai généré ces consumer_feedback valeurs, Service_ID , Service_Type en utilisant le concept des nombres aléatoires. J'ai utilisé la fonction :

int min1=31;//printer
int max1=35;//the values are generated if the Service_Type is printer.
int provider1 = (int) (Math.random() * (max1 - min1 + 1) ) + min1;
int min2=41;//data
int max2 =45
int provider2 = (int) (Math.random() * (max2 - min2 + 1) ) + min2;
int min3=71;//computing
int max3=75;
int provider3 = (int) (Math.random() * (max3 - min3 + 1) ) + min3;        
int min5 = -1;//feedback values
int max5 =1;
int feedback = (int) (Math.random() * (max5 - min5 + 1) ) + min5;

J'ai besoin de la Service_Types à être distribué uniformément dans tous les 30 tableaux. J'ai besoin de même valeur commentaires 1 à générer plusieurs fois autres que 0 et -1.

répondre #1

Si vous avez 30 numéros et vous devez les 30 numéros disponibles de votre méthode, puis un générateur aléatoire ne sera pas bon pour vous. Dans ce cas, je pense qu'il serait plus souhaitable d'ajouter les 30 numéros à une liste et appelez la méthode [Collections.shuffle][1] pour brouiller le contenu de la liste et puis simplement parcourir avec un for ... each bloc. Si ce que vous voulez est des nombres réellement aléatoires, vous devez utiliser la classe Random, comme l'explique Stephen.

N'oubliez pas que vous ne devez pas créer une nouvelle instance de la classe Random, chaque fois que vous avez besoin d'un nombre aléatoire :

public Random()

crée un nouveau générateur de nombres aléatoires. Sa graine est initialisé à une valeur basée sur l'heure courante :

   publique Random() {this(System.currentTimeMillis());}

Deux objets Random créés dans le même millième de seconde aura la même séquence de nombres aléatoires.

De http://java.sun.com/j2se/1.4.2/docs/api/java/util/Random.html#Random()

Il est conseillé d'utiliser le Random.nextInt(int n) , fournissant la valeur entière maximale, comme la pratique courante Random.nextInt() % n ne génère pas de numéros répartis uniformément.

Si vous avez besoin d'un nombre compris entre 50 et 100, c'est simple comme ceci :

Random r = new Random() ;
public int yourMethod() {
   retour r.nextInt(50) + 50 ;
}

[1]: http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#shuffle(java.util.List, java.util.Random)

répondre #2

Sous le capot, Math.random() utilise une instance de java.util.Random pour générer les nombres. Vous pouvez éviter le désordre du mappage entre doubles et entiers en utilisant directement les API de Random :

Faire quelque chose comme ceci :

import java.util.Random;

...

private static Random prng = new Random();

...

int min1=31;//printer

int  max1=35;//the values are generated if the Service_Type is printer.

int provider1 = prng.nextInt(max1 - min1 + 1) + min1;

Bien sûr, le nombre de générée par Random ne sont pas très aléatoire, mais ils sont assez bons pour votre cas d'utilisation. Cependant, je me demande si on en fait ne le mieux à l'aide d'une stratégie de « round robin » pour répartir la charge sur les périphériques.

répondre #3

Modifier : Cette réponse est basée sur une interprétation erronée de la question, où j'ai pris "autant de fois que 0 et -1" signifie "plusieurs fois plus que 0 et -1". Je quitte cette réponse vers le haut dans le cas où il est utile à quelqu'un d'autre, mais je doute qu'il sera utile pour l'affiche originale.


Pour générer des nombres aléatoires non uniforme, vous devrez spécifier ce qui doivent être les poids. Par exemple, peut-être vous voulez il faut trois fois plus de 1 s qu'il y a de 0 ou de -1.

Voici une méthode qui prend un tableau de trois double valeurs, où la première valeur est le poids de -1, la deuxième valeur est le poids de 0, et la troisième valeur est le poids de 1. Avec la probabilité différente basée sur les poids que vous donnez vous générez -1, 0 ou 1.

public int minusOneZeroOrOne(final double[] weights)
{
    if (weights.length != 3)
        throw new IllegalArgumentException("Must provide three weights");
    double weightTotal = 0.0;
    for (final double next : weights)
        weightTotal += next;
    double random = Math.random() * weightTotal;
    if (random < weights[0])
        return -1;
    if (random < (weights[0] + weights[1]))
        return 0;
    return 1;
}

J'ai testé cette méthode en le qualifiant avec le tableau de poids { 1.0, 1.0, 3.0 } (c'est-à-dire trois fois plus nombreuses de 1 que de 0 ou de -1) cent mille fois, et j'ai obtenu les résultats suivants :

$ java RandomTest | sort | uniq -c
  20062 -1
  19776 0
  60162 1

Comme vous pouvez le voir, je suis à peu près trois fois plus nombreux « 1 » résultats que j'ai obtenu des résultats « 0 » ou "-1" des résultats.

répondre #4

Vous pourriez fondamentalement avoir une liste de codes consumer_feedback (répartis) et ensuite retiré il les codes mais à l'aide d'un index au hasard, que vous pouvez garantir le nombre exact de chaque code de consumer_feedback que vous voulez attribué aux « Services ».

Il s'agit d'un code Groovy qui illustrent le concept :

Hypothèses :

  • 99 services records
  • 3 codes différents consumer_feedback

Pour avoir une répartition égale je dois attribuer un « code de consumer_feedback » à 33 « Services » et ce pour chacun d'eux. (Par souci de simplicité, j'ai choisi les numéros qui sont multiples de 3, comme votre question avaient 3 codes de consumer_feedback)

//Creating the pool of available feedback codes 
feedbacks = []
feedback = 0;
3.times {
    33.times {
        feedbacks << feedback
    }
    feedback++
}

rnd = new Random()

idx = 0
services = [:]
99.times {
    services["Service_${idx++}"] =
        feedbacks.remove(rnd.nextInt(feedbacks.size()))
}

println Collections.frequency(services.values(), 0)
println Collections.frequency(services.values(), 1)
println Collections.frequency(services.values(), 2)

println services

Tags lesen

 
 
logo_banner