Des nombres aléatoires à 100: Matlab
[Je suis la division d'un nombre de la population dans les différentes matrices et veux tester mon code à l'aide de nombres aléatoires pour l'instant.]
Petite question les gars et merci pour votre aide à l'avance -
Si j'utilise;
100*rand(9,1)
Quelle est la meilleure façon de rendre ces 9 numéros à 100?
J'aimerais 9 nombres aléatoires entre 0 et 100 qui ajouter jusqu'à 100.
Est-il intégré de commande qui fait cela parce que je n'arrive pas à le trouver.
- double possible de Non biaisée de renvoyer une liste de n aléatoire de nombres positifs (>=0), de sorte que leur somme == total_sum
- Bonne question, mais une double exemplaire: l'indépendant du langage aspect est de loin plus important que la fonction de la langue de la partie.
Vous devez vous connecter pour publier un commentaire.
Je vois l'erreur, si souvent, la suggestion que pour générer des nombres aléatoires avec une somme donnée, on utilise simplement un uniforme aléatoire, et juste une mise à l'échelle. Mais le résultat est vraiment uniformément aléatoire si vous le faire de cette façon?
Essayez ce test simple en deux dimensions. Générer un énorme échantillon aléatoire, puis la mise à l'échelle à la somme de 1. Je vais utiliser bsxfun de faire la mise à l'échelle.
Si elles ont vraiment été uniformément aléatoire, alors la coordonnée x serait uniforme, de même que la coordonnée y de la. Toute valeur serait également susceptible de se produire. En effet, pour les deux points à la somme de 1 ils doivent être situés le long de la ligne qui relie les deux points (0,1), (1,0) dans le (x,y) d'avion. Pour les points à l'uniforme, à tout point le long de cette ligne doit être tout aussi probable.
Clairement l'uniformité échoue lorsque j'utilise la mise à l'échelle de la solution. N'importe quel point de la ligne n'est PAS la même probabilité. Nous pouvons voir la même chose se produit dans les 3 dimensions. De le voir sur la figure 3-d ici, les points dans le centre de la région triangulaire sont plus denses. C'est un reflet de la non-uniformité.
Encore une fois, la simple mise à l'échelle de la solution échoue. Simplement, il ne produit PAS vraiment uniforme résultats sur le domaine d'intérêt.
Pouvons-nous faire mieux? Eh bien, oui. Une solution simple en 2-d est de générer un seul nombre aléatoire qui désigne la distance le long de la ligne reliant les points (0,1) et 1,0).
Il peut être montré que n'IMPORTE quel point le long de la ligne définie par l'équation x+y = 1, dans le carré, est maintenant tout aussi susceptibles d'avoir été choisie. Ceci est reflété par la belle, plat histogramme.
Fait le genre de truc proposé par David Schwartz travail à n-dimensions? De toute évidence, elle le fait en 2-d, et la figure ci-dessous suggère que cela soit fait en 3-dimensions. Sans une réflexion profonde sur la question, je crois qu'il va travailler pour cette affaire en question, à n-dimensions.
On peut également télécharger la fonction randfixedsum à partir du fichier d'échange, Roger Stafford contribution. C'est une solution générale pour générer vraiment aléatoire uniforme définit dans l'unité de l'hyper-cube, avec une somme fixe. Ainsi, pour générer des ensembles de points qui se trouvent dans l'unité 3-cube, soumis à la contrainte de leur somme soit égale à 1,25...
Un moyen simple est de prendre 8 nombres aléatoires entre 0 et 100. Ajouter 0 et 100 à la liste de 10 numéros. Les trier. Alors la sortie de la différence entre chaque paire de nombres. Pour exemple, voici 8 nombres aléatoires entre 0 et 100:
96, 38, 95, 5, 13, 57, 13, 20
Donc ajouter 0 et 100 et de tri.
0, 5, 13, 13, 20, 38, 57, 95, 96, 100
Maintenant soustraire:
5-0 = 5
13-5 = 8
13-13 = 0
20-13 = 7
38-20 = 18
57-38 = 19
95-57 = 38
96-95 = 1
100-96 = 4
Et là vous l'avez, neuf numéros de la somme de 100: 0, 1, 4, 5, 7, 8, 18, 19, 38. Que j'ai eu un zéro et un était juste une étrange peu de chance.
Il n'est pas trop tard pour donner la bonne réponse
Parlons d'échantillonnage X1...XN dans l'intervalle [0...1] tels que la Somme(X1, ..., XN) est égal à 1. Ensuite, vous pouvez le redimensionner à 100
Ce qui est appelé Distribution de Dirichlet, et ci-dessous le code de l'échantillon à partir d'elle. Plus simple des cas, c'est quand tous les paramètres sont égaux à 1, alors toutes les distributions marginales de X1, ..., XN serait U(0,1). Dans le cas général, avec des paramètres différents de 1s, les distributions marginales pourraient avoir des pics.
----------------- prises de ici ---------------------
La Dirichlet est un vecteur d'unité à l'échelle gamma variables aléatoires, normalisé par leur somme. Alors, sans aucune vérification des erreurs, ce sera vous qui:
Prendre une liste de N - 1 nombres, créer une liste de N + 1 nombres en insérant 0 et 100, le tri de la liste, et diff à un total de N nombres.