日期:2014-05-20  浏览次数:20725 次

无意之间的发现。绝对出乎你意料的输出结果。程序也会忽悠你。
今日无聊,随便写点东西练手。
想写个获取随机数的类
然后调用,输出。
这是没啥问题。
然后循环N次输出呢?
出来的是N个是随机数吗?
呵呵,你果断被自己写的代码骗了。
废话不多说,上代码了。
自己运行下试试。结果绝对让你惊讶。
C# code

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

namespace random
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 100; i++)
            {
                sj s = new sj();
                int N = s.sjff(1, 100);
                Console.WriteLine(n);
            }
            Console.ReadKey();
        }
        public class sj
        {
            public int sjff(int a, int b)
            {
                Random r = new Random();
                int N = r.Next(a, b);
                return N;
            }
        }
    }
}



简单代码不解释了。
Random 也不见得是完全随机,估计是根据毫秒为单位的吧?
用来测试机器性能不错,重复越多性能越好。
有大神出来深入解释下原理没?

------解决方案--------------------
// 摘要:
// 使用与时间相关的默认种子值,初始化 System.Random 类的新实例。
public Random();
------解决方案--------------------
原来你不知道伪随机为何物…
------解决方案--------------------
探讨

原来你不知道伪随机为何物…

------解决方案--------------------
如果种子一样,那生成的随机数也是完全一样的。
------解决方案--------------------
看到结果,我也傻了
------解决方案--------------------
Random 类
备注部分
“下面的示例演示两个连续实例化的 Random 对象生成相同的随机数序列。”
------解决方案--------------------
生成重复的随机是伪随机的重要而有用的特性。它可以使得某些测试场景可以重现。
------解决方案--------------------
程序不会忽悠你,你需要的是知识。
------解决方案--------------------
大学的时候没有学过伪随机数生成算法么?
------解决方案--------------------

你知道鼠标双击两下就能打开VS吗?可神奇了
------解决方案--------------------
上学时我还写了段程序专门测了下Random()这个东东、
发现它不是产生随机数的、
只要一开始给定了一个种子值、
后面的数就会固定的了、
到60多万个数的时候他又回到第一个数了、
这个根本就不能产生随机数、只是我们每次的种子值都是根据系统时间得到的而已、
只要是同一时间那么他产生的数都是一样的
------解决方案--------------------
一个程序的Random只需要生成一个实例就可以了。
每个函数里new一次种子是不会变的。
------解决方案--------------------
随机数要加一个时间戳的,它是无辜的,没有骗你,只是你不懂它~~~