【问题标题】:C# Make a sum with two random numbers but it must equal the users inputC#用两个随机数求和,但它必须等于用户输入
【发布时间】:2013-06-11 13:22:01
【问题描述】:

我想知道是否可以从用户输入 int 中求和,但总和每次都必须是随机的。

这是我编写的代码:

    public static string genSum(int askedNumber)
    {
        string outputStr = null;

        bool switchOneTwo = false;
        int neededSum = 0;

        int intOne = 0;
        int intTwo = 0;

        while (askedNumber != neededSum)
        {

            if (switchOneTwo == true)
            {
                intOne += 1;
                switchOneTwo = false;
            }
            else
            {
                intTwo += 1;
                switchOneTwo = true;
            }

            neededSum = intOne + intTwo;

            if (neededSum == askedNumber)
            {
                if (neededSum >= 4)
                {
                    Random randomInt = new Random();

                    int tmpIntOne = intOne;
                    int tmpIntTwo = intTwo;
                    int method;

                    //For now only one method
                    method = randomInt.Next(1, 1);

                    if (method == 1)
                    {
                        tmpIntOne = tmpIntOne / 2;
                        tmpIntTwo = (tmpIntTwo * 2) - tmpIntOne;
                    }

                    intOne = tmpIntOne;
                    intTwo = tmpIntTwo;                
                }

                outputStr = "(" + intOne.ToString() + "+" + intTwo.ToString() + ")";

                return outputStr;
            }
        }
        return outputStr;
    }

所以我想要的是,如果用户输入一个数字,例如 20,它就会得到一个总和:

用户输入 20 并按下 GO! :

结果:

10 + 10 = 20

12 + 8 = 20

5 + 15 = 20

1 + 19 = 20

3 + 17 = 20

用户输入 500 并按下 GO! :

结果:

9 + 491 = 500

263 + 237 = 500

300 + 200 = 500

250 + 250 = 500

109 + 391 = 500

【问题讨论】:

标签: c# math random sum


【解决方案1】:

创建一个小于输入的随机数,另一个将是 User-YourRandom

void Foo(int userNumber)
{
    Random r = new Random();
    int firstNumber = r.Next(userNumber - 1);
    int secondNumber = userNumber - firstNumber;
}

您也可以扩展它以支持否定。

编辑获得真正的随机数

正如 I4V 指出的那样,如果你把它放在一个循环中,你可能会得到相同的一组数字,所以你可以使用这种方法而不是调用 Random

void Foo(int userNumber)
{
    int userNumber = 500;

    for (int i = 0; i < 10; i++ )
    {
        int firstNumber = Next(0, userNumber - 1);
        int secondNumber = userNumber - firstNumber;

        Console.WriteLine(firstNumber + "+" + secondNumber);
    }
}

internal static int RandomExt(int min, int max)
{
    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
    byte[] buffer = new byte[4];

    rng.GetBytes(buffer);
    int result = BitConverter.ToInt32(buffer, 0);

    return new Random(result).Next(min, max);
}

【讨论】:

  • 请注意,new Random() 使用当前时间作为其种子,因此您实际上可能只需要一个您使用的 static Random
  • @TimS。这不是一个坏主意,但对于任何这样做的人来说,请记住Random.Next() 不是线程安全的,因此静态实例应该隔离到单个线程或正确同步访问。
  • @TimS。这是一个简化的示例,我使用 RNGCryptoServiceProvider 作为我的随机数
  • 假设您的代码返回return firstNumber + "+" + secondNumber;,如果您在循环中运行代码,您很可能会得到相同的字符串。 for (int i = 0; i &lt; 5; i++) Console.WriteLine(Foo(500));
  • 与您的编辑有关:您认为这是Random 类的问题,还是您的代码在每次迭代中创建一个新的随机对象作为@TimS 的问题。指出。
【解决方案2】:
foreach (var s in genSum(500).Take(5))
{
    Console.WriteLine(s);
}

public static IEnumerable<string> genSum(int askedNumber)
{
    Random r = new Random();
    while (true)
    {
        var i = r.Next(0, askedNumber);
        yield return i + "+" + (askedNumber - i);
    }
}

【讨论】:

  • 介意解释一下你在做什么?
  • @odyodyodys 介意解释一下您的具体要求吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
相关资源
最近更新 更多