所以我创建了一个简单的随机同余数字生成器。这是我第一次使用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 = "";
}
}
}
答案 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