【问题标题】:Random number in c# which should be exactly random every time?c#中的随机数每次都应该完全随机?
【发布时间】:2011-11-12 02:54:39
【问题描述】:

我正在尝试为我的心算测验游戏生成随机数。但我认为我做错了什么。请帮助我更正我的代码。请尝试包括某种解释,为什么我的代码不正确。提前致谢!

 using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;


    namespace MindTraining
    {
        class Program
        {
            static void Main(string[] args)
            {

                Console.WriteLine("Enter the digits of first number ");
                int a=int.Parse(Console.ReadLine());
                Console.WriteLine("Enter the digits of second number");
                int b = int.Parse(Console.ReadLine());

                Random RandomClass = new Random(DateTime.UtcNow.Second);

                int RandomNumber = RandomClass.Next(10^(a-1), 10^a);
                Console.WriteLine(RandomNumber);
    }


    }

}

我想要实现的是,我希望用户输入数字 a 中的位数和数字 b 中的位数

然后程序会生成随机数,假设用户输入2作为a,那么程序必须生成0到10之间的数字(随机数,每次不同)

如果用户为 a 输入 3,则在 10 到 100 之间,

b 类似,然后计算 product.Number 在程序运行期间不应重复超过 2 次。

好的,我把代码改成了

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace MindTraining
{
    class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine("Enter the digits of first number ");
            int a=int.Parse(Console.ReadLine());
            Console.WriteLine("Enter the digits of second number");
            int b = int.Parse(Console.ReadLine());

            Random RandomClass = new Random(DateTime.UtcNow.Second);
            double num1=Math.Pow(10,a-1);
            double num2=Math.Pow(a,1);
            int num3 = Convert.ToInt32( num1);
            int num4=Convert.ToInt32(num2);

            int RandomNumber = RandomClass.Next(num3,num4);
            Console.WriteLine(RandomNumber);
}}

//但还是没有得到结果,我抛出错误,

这个成功了!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace MindTraining
{
    class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine("Enter the digits of first number ");
            int a=int.Parse(Console.ReadLine());
            Console.WriteLine("Enter the digits of second number");
            int b = int.Parse(Console.ReadLine());

            Random RandomClass = new Random();
            double num1=Math.Pow(10,(a-1));
            double num2=Math.Pow(10,(a));
            int num3 = Convert.ToInt32( num1);
            int num4=Convert.ToInt32(num2);

            int RandomNumber = RandomClass.Next(num3,num4);
            Console.WriteLine(RandomNumber);
}


}






        }

【问题讨论】:

  • 如果我们不知道您希望这段代码到底做什么,就很难判断您做错了什么。
  • 如果你想要一些“完全随机”的东西(我假设你的意思是“每次都可能不同”),那么你为什么将自己限制为只有 60 个可能的种子值?跨度>
  • “在程序运行期间,数字不应重复超过 2 次”与“完全随机”不兼容。一个真正随机的序列总是可以有任意长的相同值的重复。这不是问题的原因,但值得理解。

标签: c# random-sample


【解决方案1】:

^ 不是 c# 中幂运算符的提升。 为此使用Math.Pow

【讨论】:

    【解决方案2】:

    C# 中的^ 运算符表示“异或”(XOR),而不是求幂。在这里阅读:http://www.dotnetperls.com/xor。请改用Math.Pow

    【讨论】:

    • 我不确定这是“伟大的思想都一样”还是“傻瓜很少不同”的案例......只有时间会证明一切!
    • 谢谢,不胜感激。
    【解决方案3】:

    您是否有任何理由要使用如此有限的种子值?为什么不使用

    Random RandomClass = new Random();
    

    为您的对象采用基于时间的默认种子值?

    另外,使用 Math.pow(base,exp) 计算 Random.next() 调用的范围:

    int RandomNumber = RandomClass.Next((int)Math.Pow(10,(a-1)), (int)Math.Pow(10,a));
    

    在您的代码中,发生错误的原因是,

    double num2=Math.Pow(a,1);
    

    返回一个自身。因此,您在 Random.next() 中的最大值低于您的最小值,这在逻辑上是不正确的。这是我在运行您的代码时遇到的错误,除了您最后缺少右大括号这一事实之外。

    此外,您必须意识到没有完美的随机数生成器。所有这些都是伪随机生成器。它们遵循数轴上数字的正态分布。因此,除非您存储所有生成的数字并继续检查它们,否则说一个数字在一次执行中不会生成超过两次是不可行的。这应该是最后的手段,只有在迫切要求的情况下。

    【讨论】:

    • 嗨,Darnir,我试过了。它说 RandomClass.Next 接受 int 参数,而 math.pow 给出双重参数,所以这不起作用。我也按照你的建议编辑了我的代码。请给予跟进。
    • 哦,好吧.. 对,我的错,应该明确类型转换它。
    【解决方案4】:

    在生成一个 TRULY 随机数时,你不能假设这个数字总是不同的,希望你明白了。所以你需要另外确保每次的数字都不一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 2018-09-08
      • 1970-01-01
      • 2017-03-31
      • 2012-05-17
      • 1970-01-01
      相关资源
      最近更新 更多