2017-09-28 1 views
0

Je crée donc un générateur de nombres congruents aléatoire simple. C'est la première fois que j'utilise des formulaires Windows et pour une raison quelconque, les résultats ne cessent de me donner 0. Quelqu'un peut-il me dire ce qui se passe?Pourquoi mes valeurs de retour continuent à me donner 0 sur un programme générateur de nombres congruents aléatoires?

Ce que fait mon programme, c'est que l'utilisateur ajoute la graine a, c, mod, et combien de fois il veut itérer des nombres aléatoires. Mais quand je clique sur "générer", cela me donne juste 0 dans chaque nouvelle ligne, en fonction de ce que je veux faire. Au moins, je sais que l'itération est correcte.

namespace Metodos 
{ 
    public partial class Mixto : Form 
    { 
     public Mixto() 
     { 
      InitializeComponent(); 
     } 

     private void bttnGen_Click(object sender, EventArgs e) 
     { 
      int seed, a, c, mod, it, numrand, residuo; 
      float division; 

      seed = Convert.ToInt32(txtSeed.Text); 
      a = Convert.ToInt32(txtA.Text); 
      c = Convert.ToInt32(txtC.Text); 
      mod = Convert.ToInt32(txtMod.Text); 
      it = Convert.ToInt32(txtIt.Text); 

      for (int i = 1; i <= it; i++) 
      { 
       string newLine = Environment.NewLine; 
       numrand = seed * a + c; 
       residuo = numrand % mod; 
       division = residuo/mod; 
       residuo = seed; 
       results.Text = results.Text + newLine + division.ToString(); 
      } 
     } 

     private void bttnClear_Click(object sender, EventArgs e) 
     { 
      results.Text = ""; 
     } 
    } 
} 

Répondre

1

Vous faites une division entière sur cette ligne:

division = residuo/mod; 

Par conséquent, si votre résultat réel est rien de moins que 0 (disons, 0.34), vous obtiendrez la valeur 0 à votre division.

Au lieu de cela, faire

division = (float)residuo/mod; 
1
residuo = numrand % mod; 

division = residuo/mod; 

Sur ces deux lignes, vous définissez residuo égal au modulo (reste) d'une division. Vous divisez ensuite ce reste par mod. residuo sera TOUJOURS inférieur à mod à cette étape (par sa nature d'être un reste d'une division avec le même diviseur). Comme il est division entière, cela donne toujours 0. Vous devez probablement remplacer numrand pour residuo en ligne 2

residuo = seed; 

Je pense que cette ligne peut être aussi bien en arrière. Je suppose que vous aviez l'intention de modifier la graine pour la prochaine itération?

La réalisation de ces deux changements, comme ci-dessous, je reçois quelque chose qui semble fonctionner

int seed, a, c, mod, it, numrand, residuo; 
    float division; 

    seed = 23; 
    a = 34 ; 
    c = 17; 
    mod = 45; 
    it = 100; 




    for (int i = 1; i <= it; i++) { 
    string newLine = Environment.NewLine; 

    numrand = seed * a + c; 

    residuo = numrand % mod; 

    division = numrand/mod; 

    //residuo = seed; 
    seed = residuo; 

    Console.WriteLine("{2}",numrand, residuo, division); 

    } 

Output: 
10 
7 
6 
14 
25 
10 
32 
29 
29 
3 
13 
33 
21 
18 
17 
26 
2 
22 
10 
7 
6 
14 
25