Comment puis-je faire cela? Je sais comment générer des nombres aléatoires mais pas dans une plage fixe. P>
4 Réponses :
Voici une solution possible:
Nous pouvons d'abord appeler notre méthode qui nous procurera notre valeur de somme. p>
Nous obtenons un nombre aléatoire entre 0 et la somme que nous avons calculée qui donnera à notre premier numéro. p>
Soustrayez notre premier numéro de la somme Obtenir un autre aléatoire pour la deuxième et la valeur finale sera à nouveau la 2e de la somme. p>
Le constructeur par défaut aléatoire () code> est meilleur que vous pour fournir une graine, alors laissez-le le faire pour vous et simplement écrire
rand rand = nouveau aléatoire (); code>.
Je suppose que vous voulez générer une combinaison aléatoire de n entiers tels que - p>
MINSUM code>, maxsum code>], li>
- Les entiers apparaissent dans un ordre aléatoire et li>
- La combinaison est choisie uniformément au hasard parmi toutes les combinaisons répondant aux autres exigences. LI>
ul>
Ceci peut être décrit comme - p>
- Choisir une somme aléatoire (selon le nombre de combinaisons possibles pour cette somme), puis li>
- Choisir une combinaison aléatoire pour cette somme. Li>
ol>
La partie 2 est triviale grâce à l'algorithme Smith and Tromble, et je donne du code rubis pour cet algorithme dans un question pour un problème connexe . p>
La partie 1 est la partie délicate. Cela implique - P>
- comptant le nombre de combinaisons valides pour chaque somme dans [
MINSUM code>, maxum code>] (plus formellement, le nombre de partitions de chaque somme en n parties, où chaque partie peut être vide et survenir plus d'une fois), puis li>
- Choisir une somme aléatoire avec probabilité proportionnelle au nombre de combinaisons valides (partitions) pour cette somme. li>
ul>
Ce n'est que un croquis du problème, car je ne connais pas la formule exacte qui répond aux trois premières exigences énoncées ci-dessus dans cette réponse. Tout ce que je sais, c'est que le nombre de partitions de N dans les parties K non vides est égal au nombre sterling du deuxième type (mais je ne connais pas une formule similaire pour le cas où les pièces peuvent être vides ou que les pièces peuvent survenir plus d'une fois). P>
Pourquoi ne faites-vous pas simplement au hasard la somme. Générez ensuite n nombres aléatoires avec cette somme référence: générer n nombres aléatoires dont la somme est m et que tous les nombres doivent être supérieurs à zéro p> p>
Ceci est probablement votre meilleur choix pour une solution générique:
int[] randomNumbersWithSumBetween(int num, int min, int max, Random random) { if (min > max) throw new IllegalArgumentException("min > max"); if (num < 1) throw new IllegalArgumentException("No random numbers to generate"); int[] result = new int[num]; result[0] = min + random.nextInt(max - min); for (; num-- > 1; ) { result[num] = random.nextInt(result[0]); result[0] -= result[num]; } return result; }
Voir ce message Stackoverflow.com/Questtions/22380890/...
Si vous voulez la plage, il sera
rand.nextint (math.abs (x-y)) + math.min (x, y) code>
Si vous avez une nouvelle question, vous devez la poser comme une question distincte au lieu de la modifier. Pour cette question spécifique, cela serait également un duplicata, cependant - voir Stackoverflow.com/Questtions/363681/... . Ou si vous avez besoin de double au lieu d'entiers, voir Stackoverflow.com/Questtions/3680637/...