我正在进行一项测验,用于测试用户的基本算术技能。我遇到的问题是我不希望能够生成允许实数的除法问题。我希望所有答案都有整数答案。
如何在p和q之间随机生成一个均数分为n?
的数字答案 0 :(得分:6)
我们的想法是生成两个整数a and n
,然后返回a
和c = a * n
。回答者应该猜测n
和要小心除零!
这样的事情会:
public KeyValuePair<int, int> GenerateIntDivisibleNoPair(int p, int q) {
if (p <= 0 || q <= 0 || q <= p)
throw Exception(); //for simplification of idea
Random rand = new Random();
int a = rand.Next(p, q + 1); //cannot be zero! note: maxValue put as q + 1 to include q
int n = rand.Next(p, q + 1); //cannot be zero! note: maxValue put as q + 1 to include q
return new KeyValuePair<int, int>(a, a * n);
}
你这样使用它:
KeyValuePair<int, int> val = GenerateIntDivisibleNoPair(1, 101);
Console.WriteLine("What is " + val.Value.ToString() + " divide by " + val.Key.ToString() + "?");
答案 1 :(得分:1)
我会在全局访问的地方声明一个Random:
public static Random Rnd { get; set; }
然后当你想要一个除以另一个数字的数字时,你会继续生成一个数字,直到得到一个除以你的除数的数字:
if(Rnd == null)
{
Rnd = new Random();
}
int Min = p; //Can be any number
int Max = q; //Can be any number
if(Min > Max) //Assert that Min is lower than Max
{
int Temp = Max;
Max = Min;
Min = Temp;
}
int Divisor = n; //Can be any number
int NextRandom = Rnd.Next(Min, Max + 1); //Add 1 to Max, because Next always returns one less than the value of Max.
while(NextRandom % Divisor != 0)
{
NextRandom = Rnd.Next(Min, Max + 1); //Add 1 to Max, because Next always returns one less than the value of Max.
}
检查使用模数函数%。此函数为您提供整数除法的余数。
这意味着如果NextRandom%Divisor为0,则除数将均分为NextRandom。
这可以变成这样的方法:
public static int GetRandomMultiple(int divisor, int min, int max)
{
if (Rnd == null)
{
Rnd = new Random();
}
if(min > max) //Assert that min is lower than max
{
int Temp = max;
max = min;
min = Temp;
}
int NextRandom = Rnd.Next(min, max + 1); //Add 1 to Max, because Next always returns one less than the value of Max.
while (NextRandom % divisor != 0)
{
NextRandom = Rnd.Next(min, max + 1); //Add 1 to Max, because Next always returns one less than the value of Max.
}
return NextRandom;
}
然后你可以用你提到的变量调用它,如下所示:
int Number = GetRandomMultiple(n, p, q);
注意:由于“下一步”方法,我在Max的值中加了一个。我认为这是.Net中的一个错误。永远不会返回Max的值,只有Min..Max - 1.添加一个可以补偿这一点。