2010-07-01 4 views
0

J'ai un angle dire 60deg et que vous souhaitez générer angle aléatoire dans un intervalle dire [-120120] où l'intervalle centré autour du 60deg qui soit maintenant [-60180]générateur aléatoire angle

Je le code ci-dessous:

http://www.cs.princeton.edu/introcs/22library/StdRandom.java.html

Je suis confus parce qu'il est dit que la distribution gaussienne est dans [0,1].

Comment est-ce que je pourrais passer la gamme [-120,120]?

Le 60 angle est la rotation relative d'un objet l'angle aléatoire généré est un prédicat de son côté postion

Lors du test du code I ont des angles, disons 65, 55 si j'utilise cet angle directement, il effectue Stranges donc je prends la différence 65-60, 55-60.

Est-ce que cette idée est correcte?

+4

[-120, 120] centre est placé à 0 –

+1

Peut-être que vous voulez dire que vous voulez la moyenne à 60? si oui, s'il vous plaît modifier votre question en conséquence –

Répondre

7

Si vous avez un nombre aléatoire avec une plage de 0 à 1, vous pouvez le convertir en -120 à 120 en utilisant:

rand_num*240 - 120 

Plus généralement, transformer un nombre dans la plage [A, B] range [C, D] implique:

num * (D-C)/(B-A) + C 

Je ne suis pas sûr de ce que vous voulez dire en gardant votre moyenne, cependant.


Si vous voulez une plage comprise entre 120 dans chaque direction, de 60, vous pouvez soit faire ci-dessus et ajouter 60 ou utiliser une gamme [60-120,60+120] = [-60,180]

En ce sens, vous devriez ont

rand_num * 240 - 60 

suivant la formule donnée ci-dessus

+0

merci pour cette formule – tasyjean

0

Si vous avez quelque chose qui génère des nombres aléatoires dans une plage telle que [0, 1] » s facile de transformer cela en une autre gamme, comme [-120, 120]: il suffit de multiplier par la taille de la plage cible (240 dans ce cas) et d'ajouter le début de la plage cible (-120 dans ce cas)).

Ainsi, par exemple:

java.util.Random random = new java.util.Random(); 

// Generate a random number in the range [-120, 120] 
double value = random.nextDouble() * 240.0 - 120.0; 

Y at-il une raison particulière pour laquelle vous utilisez cette classe StdRandom? La distribution des nombres aléatoires doit-elle être gaussienne? (Cela n'a pas d'importance, ce qui précède fonctionnera toujours).

Si elle doit être centrée autour de 60, puis il suffit d'ajouter 60.

+0

j'utilise gaussian pour bénéficier de l'écart-type afin que je puisse contrôler la propagation du centre je pense que je peux le faire dans votre code par multiple it avec le stdev – tasyjean

2
static void Main(string[] args) 
{ 
    Random rand = new Random(); 
    double a = 0; 
    for (int i = 0; i < 1000; i++) 
    { 
     double r = rand.NextDouble() * 240 - 60; 
     a += r; 
     Console.WriteLine(string.Format("ang:{0,6:0.0} avg:{1,5:0.0}", r, a/(i + 1))); 
    } 
    Console.ReadKey(); 
} 
0

Essayez ceci:

import java.lang.Math; 

public static void main(String[] args) 
{ 
    System.out.println((int)(Math.random()*(-240))+120); 
} 

Vous avez C# et Java marqués comme balises. Sorte de confusion pour savoir lequel vous voulez. Je préfère cela à la classe Random en java.utils parce que vous n'avez pas besoin d'instancier une classe. Tout ce dont vous avez besoin est dans les méthodes statiques de la classe Math.

Répartition:

return Math.random(); // returns a double value [0, 1] 

return Math.random()*-240; // returns a double value from [-240, 0] 

return (int)(Math.random()*-240); // returns an integer value from [-240, 0] 

return (int)(Math.random()*-240) + 120; // returns an integer value from [-120, 120]