在C#中生成一个均匀分为另一个的随机数

时间:2016-02-23 07:44:49

标签: c# .net random

我正在进行一项测验,用于测试用户的基本算术技能。我遇到的问题是我不希望能够生成允许实数的除法问题。我希望所有答案都有整数答案。

如何在p和q之间随机生成一个均数分为n?

的数字

2 个答案:

答案 0 :(得分:6)

我们的想法是生成两个整数a and n,然后返回ac = 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.添加一个可以补偿这一点。