为何我单步运行的时候每次出现的数字不一样,一旦用for循环输出的数字都是一样的了,包括用数组输出的时候也是一样的结果,请大家帮助!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using rocktest;
using System.Collections;
namespace rocktest
{
  class programm
{
  public static int PoissonRandomNumber(double Lemda)
        {
            double u;
            int Z = 0;
            double L;
            double p = 1.0;
            L = Math.Exp(-Lemda);
            Random rand = new Random();            do
            {
                Z = Z + 1;
                u = rand.NextDouble();
                p = p * u;            }
            while (p >= L);
            return Z - 1;
        }
          static void Main(string[] args)
           {
                //for (int i = 0; i < 10; i++)
            Console.WriteLine(rocktest.Program.BinomialRandom(0.5, 10));            }
}
}

解决方案 »

  1.   

    你需要一个Rand Seed(随机种子)来初始化Random对象
    Random rand = new Random((int)DateTime.Now.Ticks);
      

  2.   

    一看题就猜是随机数,看代码果然是:把Random rand = new Random(); 
    这一句放到方法外面。。
      

  3.   

    因为随机数默认是当前时间作为种子的,这样单步的时候时间不同,所以结果不同,循环的话由于时间很短,几乎同时执行,就结果相同了哦Random rand = new Random(); 
    这个放在外面,你是静态函数,改rand为静态变量
      

  4.   

    我个人认为:FOR循环时候,Random rand = new Random(); 只执行了一次。这个函数在内存区域就定死了。然后你MAIN函数的 
    //for (int i = 0; i < 10; i++) 
                Console.WriteLine(rocktest.Program.BinomialRandom(0.5, 10)); 
    始终调用的是一个固定的随机函数,所以,输出值一样。而单步,Random rand = new Random(); 多次执行,每一次分配的内存区域都不一样。就是RANDOM函数真正发生了变化。
    所以Console.WriteLine(rocktest.Program.BinomialRandom(0.5, 10)); 值就会不一样。
      

  5.   

    static Random rand = new Random();
      

  6.   

    可以这样写,加个Sleep
                  for (int index = 0; index < 1000;index++ )
                {
                    Random r = new Random((int)DateTime.Now.Ticks);
                    Thread.Sleep(1);
                    Console.WriteLine(r.NextDouble());
                }
      

  7.   

    [Quote=引用 8 楼 bloodish 的回复:]
    可以这样写,加个Sleep
    for (int index = 0; index  < 1000;index++ )
    {
    Random r = new Random((int)DateTime.Now.Ticks);
    Thread.Sleep(1);
    Console.WriteLine(r.NextDouble());
    }
    使用Thread.Sllep(1);会影响效率么?
      

  8.   

    楼主怎么还没明白呢?:(
    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using rocktest; 
    using System.Collections; 
    namespace rocktest 

      class programm 

      static Random rand = new Random();
      public static int PoissonRandomNumber(double Lemda) 
            { 
                double u; 
                int Z = 0; 
                double L; 
                double p = 1.0; 
                L = Math.Exp(-Lemda);             do 
                { 
                    Z = Z + 1; 
                    u = rand.NextDouble(); 
                    p = p * u;             } 
                while (p >= L); 
                return Z - 1; 
            } 
              static void Main(string[] args) 
              { 
                    //for (int i = 0; i < 10; i++) 
                Console.WriteLine(rocktest.Program.BinomialRandom(0.5, 10));             } 

    }
      

  9.   

    random 是生成伪随机数,
    种子值相同,生成的随机数也是相同的,不设置种子时,以当前时间作为种子,
    你将for循环的次数设置到足够大,在不单步的情况下执行,
    再看执行结果,你知道怎么回事了
      

  10.   

    rand.NextDouble(); 这个每次都是产生随机数呀,
    只是 Random rand = new Random(); new这个类的时候默认用了当前系统时间作为种子,事实上,除了这个种子,电脑也产生不了什么真正的随机种子,你也不可能做个随机数生成器,比这个还要好的东西的。楼主的问题是在循环里生成了若干个Random类,这些类都是几乎同时new出来的,种子相同,所以从来都数据也相同,而你的需求根本不需要这么多Random类,有一个Random就够了,用这个Random的NextDouble方法就可以产生出一系列的随机数了。明白没?
      

  11.   

    那我如何在循环里输出一系列种子不一样的随机数,随机数的生成法我有的!我想在for里每次生成的随机数都不一样?如何实现?
      

  12.   

    NextDouble没执行一次得到的都是不同的数字呀,在循环里很正常呀你的问题是类Random不能再循环里