有效解决C# Random生成随机数重复的问题

在Random生成随机数的时候,如果短时间内连续生成随机数,就会导致生成的随机数相同。下面我们介绍如何解决在 短时间内生成随机数的时候,如何避免随机数不一样的问题。
(实例下载链接:http://download.csdn.net/download/shuai_wy/10128989

补充:即使我们生成随机数的区间不一样,但是仍然面临这个问题,区间里的点是一样的。

举个栗子:

假设我们要生成 [33,35], [8,10], 我们用这两个区间短时间内生成随机数,就会发现:

第一个区间生成的是 33 的时候,第二个区间生成的是 8; 第一个区间生成的是 34的时候,第二个区间生成的是 9;

一、 有效方案:

1. 提高随机数不重复概率的种子生成方法(推荐)

//获取随机种子
static int GetRandomSeed( )
{
    byte[] bytes = new byte[4];
    System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider( );
    rng.GetBytes( bytes );
    return BitConverter.ToInt32( bytes , 0 );
}

Random random = new Random( GetRandomSeed( ) );

2. 延时

Thread.Sleep(100);
Random ran = new Random();
ran.Next();

二、其他生成随机数的方法实例


    /// <summary>
    /// 根据中位数返回区间随机数
    /// </summary>
    /// <param name="mid"></param>
    /// <returns></returns>
    private static int GetRandom(int mid)
    {
        //1.
        //Random ran = new Random();

        //2.
        //Random ran = new Random(new Guid().GetHashCode());

        //3.
        //long tick = DateTime.Now.Ticks;
        //Random ran = new Random((int)(tick & 0xffffffffL) | (int)(tick >> 32));

        //4.(*有效方法)
        //Thread.Sleep(100);
        //Random ran = new Random();

        //5.(*有效方法)
        Random ran = new Random(GetRandomSeed());

        return ran.Next(mid -5,mid +10);
    }

    static int GetRandomSeed()
    {
        byte[] bytes = new byte[4];
        System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
        rng.GetBytes(bytes);
        return BitConverter.ToInt32(bytes, 0);
    }


//控制台打印,测试一下
 static void Main(string[] args)
 {

      int count = 0;
     Random ran = new Random();
     int mid = 33;
     while (count < 50)
     {
         Console.WriteLine(GetRandom(mid));
         count++;
     }
     Console.ReadKey();
 }

生成随机数运行截图:

Random生成随机数

参考博文及实例

c# Random太快产生的随机数会重复: https://www.cnblogs.com/TouchAfflatus/p/3784225.html

实例下载: http://download.csdn.net/download/shuai_wy/10128989

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值