为什么我的返回值在随机同余数字生成器程序中不断给出0?

时间:2017-09-28 23:08:38

标签: c# loops random

所以我创建了一个简单的随机同余数字生成器。这是我第一次使用Windows窗体,由于某种原因,结果一直给我0.有人可以告诉我发生了什么吗?

我的程序正在做的是用户为种子添加a,c,mod值以及想要迭代随机数的次数。但是,当我点击生成它时,根据我希望它迭代的次数,在每个新行中给出0。至少我知道迭代是正确的。

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 = "";
        }
    }
}

2 个答案:

答案 0 :(得分:1)

你正在这一行进行整数除法:

division = residuo / mod;

因此,如果您的实际结果低于0(例如0.34),那么您0的值为division。< / p>

相反,做

division = (float)residuo / mod;

答案 1 :(得分:1)

residuo = numrand % mod;

division = residuo / mod;

在这两行中,您将residuo设置为等于除法的模数(余数)。然后,您将此余数除以mod。在此步骤中,residuo总是小于mod(由于它是具有相同除数的除法的剩余部分)。由于它是整数除法,因此总是会导致0.您可能需要在{2}上用numrand替换residuo

residuo = seed;

我认为这条线也可能倒退。我怀疑你打算修改下一次迭代的种子?

进行这两项更改,如下所示,我得到了似乎有效的内容

  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