2016-05-10 1 views
3

Il existe dans Matlab une fonction qui génère des nombres réels aléatoires dans un intervalle fermé. J'ai trouvé quelque chose avec unifrnd() mais il génère des nombres dans un intervalle ouvert. Si j'utilise unifrnd(x,y);, j'obtiens un intervalle (x, y) au lieu de [x, y].Fonction Matlab qui génère des nombres réels aléatoires dans un intervalle fermé

+1

Pouvez-vous même faire la différence dans un cas trivial? (c'est-à-dire où votre intervalle est un seul point). La probabilité des extrémités n'est-elle pas infinitésimale pour les réels? – hiandbaii

+0

Oui, je sais, mais je dois prendre ces cas en considération. C'est le problème. –

+6

En fait, la probabilité mathématique de choisir un point particulier, y compris les extrémités, à partir d'un intervalle continu est 0. @hiandbaii est correct ... il n'y a pas de différence mathématique. La représentation numérique des nombres signifie qu'en réalité, l'ordinateur sélectionne à partir d'une distribution discrète, avec une résolution maximale d'environ 1e-16, donc si vous étiez en cours d'exécution sur l'intervalle '[0,1]', vs '(0 , 1) ', vous devrez courir environ' (10^16)/2' procès pour remarquer une différence. – gariepy

Répondre

3

Compte tenu de la discussion de précision dans les commentaires, vous pouvez utiliser quelque chose comme:

mag = floor(log10(y - x)) 
num = unifrnd(x-(10^mag)*eps, y+(10^mag)*eps) 

Cela ajoute essentiellement un « point » à la représentation d'intervalle discret, en tenant compte de la précision en fonction de la taille de la les numéros que vous utilisez. unifrnd() est essentiellement un wrapper autour de rand() (ce qui signifie que vous n'avez pas vraiment besoin de la boîte à outils des statistiques pour le faire), et donc il est juste en train de mettre à l'échelle la distribution uniforme sur (0,1). Si vous vous inquiétez pour les points de terminaison, cela compte, car vous ne pouvez pas obtenir plus de granularité que le produit de l'ampleur de la longueur de votre intervalle avec eps.