oui, mais vous devez dire que generatorc'est une instance dejava.util.Random
stivlo
25
Je ne créerais pas à Random()chaque fois que vous exécutez la fonction: le générateur aléatoire est censé avoir une histoire. Sinon, c'est extrêmement prévisible. Ce n'est pas du tout un problème dans ce cas - mais il faut mentionner que array[(int)(System.currentTimeMillis() % array.length)]c'est aussi bon que la solution proposée.
alf
5
@alf, c'est loin d'être aussi bon que la solution proposée. new Random()essaie de créer une instance dont la valeur de départ est différente de celle précédemment créée Random. Votre approche casserait horriblement simplement en invoquant la fonction deux fois en peu de temps.
aioobe
1
@alf certains systèmes n'ont pas d'horloge précise à la milliseconde, ce qui peut exclure certaines options sigcd(array.length,clockAccuracy)!=1
ratchet freak
3
Je viens de remarquer une notification indiquant que j'ai refusé cette réponse - j'ai dû cliquer dessus accidentellement; malheureusement, l'interface ne me laissera pas l'annuler (elle dit que je ne peux pas changer mon vote à moins que la réponse ne soit modifiée ...). Alors, excuses à Chris Dennett.
Peter Hanley
13
Vous pouvez utiliser le générateur Random pour générer un index aléatoire et renvoyer l'élément à cet index:
Si vous allez recevoir un élément aléatoire plusieurs fois, vous voulez vous assurer que votre générateur de nombres aléatoires n'est initialisé qu'une seule fois.
Si vous choisissez des éléments de tableau aléatoires qui doivent être imprévisibles, vous devez utiliser java.security.SecureRandom plutôt que Random. Cela garantit que si quelqu'un connaît les derniers choix, il n'aura aucun avantage à deviner le suivant.
Si vous cherchez à choisir un nombre aléatoire dans un tableau Object à l'aide de génériques, vous pouvez définir une méthode pour le faire (Source Avinash R dans l' élément Random du tableau de chaînes ):
import java.util.Random;publicclassRandArray{privatestaticRandom rand =newRandom();privatestatic<T> T randomFrom(T... items){return items[rand.nextInt(items.length)];}}
utilisez java.util.Randompour générer un nombre aléatoire entre 0 et la longueur du tableau:, random_numberpuis utilisez le nombre aléatoire pour obtenir l'entier:array[random_number]
Donc, vous mélangez une liste avec la O(nlogn)complexité du temps, faites-en la copie deux fois en utilisant le total de 3 fois plus de mémoire que le tableau initial, même si le problème qu'OP a posé peut être résolu avec la O(1)complexité du temps et la O(1)mémoire ...?
Jaroslaw Pawlak
oui, vous avez raison, il valait mieux faire avec une complexité constante de temps et d'espace.
Ravi Sapariya
0
package io.github.baijifeilong.tmp;import java.util.concurrent.ThreadLocalRandom;import java.util.stream.Stream;/**
* Created by [email protected] at 2019/1/3 下午7:34
*/publicclassBar{publicstaticvoid main(String[] args){Stream.generate(()->null).limit(10).forEach($ ->{System.out.println(newString[]{"hello","world"}[ThreadLocalRandom.current().nextInt(2)]);});}}
Réponses:
la source
generator
c'est une instance dejava.util.Random
Random()
chaque fois que vous exécutez la fonction: le générateur aléatoire est censé avoir une histoire. Sinon, c'est extrêmement prévisible. Ce n'est pas du tout un problème dans ce cas - mais il faut mentionner quearray[(int)(System.currentTimeMillis() % array.length)]
c'est aussi bon que la solution proposée.new Random()
essaie de créer une instance dont la valeur de départ est différente de celle précédemment crééeRandom
. Votre approche casserait horriblement simplement en invoquant la fonction deux fois en peu de temps.gcd(array.length,clockAccuracy)!=1
Vous pouvez utiliser le générateur Random pour générer un index aléatoire et renvoyer l'élément à cet index:
la source
Si vous allez recevoir un élément aléatoire plusieurs fois, vous voulez vous assurer que votre générateur de nombres aléatoires n'est initialisé qu'une seule fois.
Si vous choisissez des éléments de tableau aléatoires qui doivent être imprévisibles, vous devez utiliser java.security.SecureRandom plutôt que Random. Cela garantit que si quelqu'un connaît les derniers choix, il n'aura aucun avantage à deviner le suivant.
Si vous cherchez à choisir un nombre aléatoire dans un tableau Object à l'aide de génériques, vous pouvez définir une méthode pour le faire (Source Avinash R dans l' élément Random du tableau de chaînes ):
la source
utilisez
java.util.Random
pour générer un nombre aléatoire entre 0 et la longueur du tableau:,random_number
puis utilisez le nombre aléatoire pour obtenir l'entier:array[random_number]
la source
Utilisez la classe Random :
la source
Vous pouvez aussi utiliser
Math.random()
renvoie undouble
entre0.0
(inclus) à1.0
(exclusif)Multiplier cela par
array.length
vous donne undouble
entre0.0
(inclus) etarray.length
(exclusif)La diffusion en
int
arrondi vers le bas vous donne un entier entre0
(inclus) etarray.length-1
(inclus)la source
Puisque vous avez java 8, une autre solution consiste à utiliser l'API Stream.
Où
1
est le plus petit entier généré (inclus) et500
est le plus élevé (exclusif).limit
signifie que votre flux aura une longueur de 500.L'aléatoire provient du
java.util
package.la source
Jetez un œil à cette question:
Comment générer des entiers aléatoires dans une plage spécifique en Java?
Vous voudrez générer un nombre aléatoire de 0 à la longueur de vos entiers - 1. Ensuite, obtenez simplement votre int de votre tableau:
la source
Java a une classe Random dans le package java.util. En l'utilisant, vous pouvez effectuer les opérations suivantes:
J'espère que cela t'aides!
la source
la source
Vous pouvez également essayer cette approche.
la source
O(nlogn)
complexité du temps, faites-en la copie deux fois en utilisant le total de 3 fois plus de mémoire que le tableau initial, même si le problème qu'OP a posé peut être résolu avec laO(1)
complexité du temps et laO(1)
mémoire ...?la source