代码之家  ›  专栏  ›  技术社区  ›  Daniel A.A. Pelsmaeker

在C语言中植入伪随机数发生器#

  •  15
  • Daniel A.A. Pelsmaeker  · 技术社区  · 14 年前

    Random 类,我看到大多数人都使用当前时间的刻度计数器。但这是一个64位值,seed必须是32位值。现在我想 GetHashCode() 方法,它返回 int ,应为其对象提供一个合理分布的值,这可用于避免仅使用低32位的滴答计数。但是,我找不到任何关于 Int64

    所以,我知道这并不重要,但是下面的工作是否会像我想的那样好(我不能尝试和错误随机性),或者它的工作方式与使用 (int)DateTime.Now.Ticks 作为种子?或者更糟?谁能给我们一些启示。

    int seed = unchecked(DateTime.Now.Ticks.GetHashCode());
    Random r = new Random(seed);
    

    编辑:为什么我需要一个种子,而不是让 Random() 建造师做这项工作?我需要将种子发送给其他客户机,这些客户机对相同的随机序列使用相同的种子。

    3 回复  |  直到 14 年前
        1
  •  34
  •   CodesInChaos    13 年前

    new Random() 已使用当前时间。相当于 new Random(Environment.TickCount) .

    我建议您使用new Random(),如果您想要获得一个可重复的伪随机值序列,则只提供一个固定的种子。

    既然你需要一颗已知的种子 Environment.TickCount 就像MS一样。然后将其作为种子传输到其他程序实例。

    如果创建多个 Random 在很短的时间间隔内(可以是16ms),它们可以被播种到相同的值,从而创建相同的伪随机序列。但这很可能不是问题。这个常见的陷阱是由windows更新当前时间造成的( DateTime.Now .UtcNow )还有滴答声( 环境.TickCount )每隔几毫秒。确切的时间间隔取决于windows的版本和运行的其他程序。它们不改变的典型间隔是16毫秒或1毫秒。

        2
  •  30
  •   steinar Justin CI    14 年前

    需要 要使用当前时间以外的其他内容(在这种情况下,您可以使用默认构造函数),可以使用以下命令:

    Random random = new Random(Guid.NewGuid().GetHashCode());
    
        3
  •  0
  •   Saman    10 年前

    我有一个类似的问题,从一个更大的问题列表中随机选择一组问题。但当我用时间作为种子时,它给出了相同的随机数。

    所以这是我的解决方案。

        int TOTALQ = 7;
        int NOOFQ = 5;
    
        int[] selectedQuestion = new int[TOTALQ];
    
        int[] askQuestion = new int[NOOFQ];
    
        /*   Genarae a random number 1 to TOTALQ
         *   - if that number in selectedQuestion array is not o
         *   -     Fill askQuestion array with that number
         *   -     remove that number from selectedQuestion
         *   - if not re-do that - - while - array is not full.    
         */
    
        for (int i = 0; i < TOTALQ; i++)  // fill the array
            selectedQuestion[i] = 1;
    
        int question = 0;
    
        int seed = 1;
    
        while (question < NOOFQ)
        {       
            DateTime now1 = new DateTime();
            now1 = DateTime.Now;    
            Random rand = new Random(seed+now1.Millisecond);
             int RandomQuestion = rand.Next(1, TOTALQ);
    
             Response.Write("<br/> seed  " + seed + " Random number " + RandomQuestion );
    
    
    
            if (selectedQuestion[RandomQuestion] != 0)      
            {
                selectedQuestion[RandomQuestion] = 0;  // set that q =0 so not to select           
                askQuestion[question] = selectedQuestion[RandomQuestion];
                Response.Write(".  Question no " + question + " will be question " + RandomQuestion + " from list " );
                question++;
            }
    
            seed++;         
    
        }