首页 > 其他分享 >Random相关的

Random相关的

时间:2022-10-23 00:11:53浏览次数:50  
标签:数字 int Random 线程 随机 new 相关

官方释义:表示伪随机数生成器,这是一种能够产生满足某些随机性统计要求的数字序列的算法。

(1)为什么叫做“伪随机数生成器”?

Random本质上是利用一种算法,利用数学算法进行加密,从一组数中挑选出一个,但它们足够随机,可用于实际目的。(来自:微软)

实际上我们可以通过相同的数学算法对Random的结果进行预测,所以要进行加密安全,请不要使用!

①  Random下面的用法在数组当中添加随机数,只适用于byte和double两种类型

byte[] bytes1 = new byte[100];
Random rnd1 = new Random();
rnd1.NextBytes(bytes1);
for(int i = 0; i < bytes1.Length; i++)
{
   Console.WriteLine(bytes1[i]);
}

② 也可用于从string[] 中随机挑选一个,返回的是他的下标值(int)

Random rnd = new Random();
string[] malePetNames = { "Rufus", "Bear", "Dakota", "Fido",
                          "Vanya", "Samuel", "Koani", "Volodya",
                          "Prince", "Yiska" };

 
// Generate random indexes for pet names
int mIndex = rnd.Next(malePetNames.Length);
Console.WriteLine(" For a male: {0}", malePetNames[mIndex]);

③ 一般用法

Random rnd = new Random();
int str=rnd.Next(1,6);//从1到5之间随机选择一个数字
int nol=rnd.Next(6);//从0到5之间随机选择一个数字

 

注意:

使用时请不要过多的实例化Random对象,像这样(这会消耗太多的计算)

Random rnd = new Random();
int str=rnd.Next(1,6);//从1到5之间随机选择一个数字
 
 
Random nor = new Random();
int nol=nor.Next(6);//从0到5之间随机选择一个数字

在线程当中注意保护Random

如果应用从多个线程调用方法,则必须使用同步对象来确保一次只有一个线程可以访问随机 Random 数生成器。 如果不确保以线程安全的方式访问对象,则对返回随机数的方法的调用 Random 将返回 0。(微软)

请确保在使用过程中不会有多个线程同时调用此方法,让他们有序调用。

 

c#的随机数种子

先来简单的说下为什么要用随机数种子

主要的原因是希望我们随机出来的数字“尽可能的”不重复、

为什么是尽可能?

这是因为Random本质上是一种数字序列的算法,所以避免不了出现重复相同。

但为了尽量随机,让他不一致,因此使用随机数种子

random首先要考虑线程问题,因此需要使用lock锁
但如果你在unity中使用,也建议你为了线程安全使用,这并不强制,这需要您注意处理伪线程。

  Object game = new Object();//线程锁
 
            Random random = new Random((int)DateTime.Now.Ticks);//随机数
            //这里面是获取你当前的时间信息作为种子来进行随机的,要求是一个整数作为种子
            注(1)
            List<int> ints = new List<int>();//将随机出来的数字保存到集合
 
            lock (game) //加线程锁,保护线程
            {
 
               
                for (int i = 0; i < 50; i++)//随机50个对象
                {
                    int ran = random.Next(0, 100);//指定范围0——100
 
                    if (!ints.Contains(ran)) //如果在集合中没有相同的数字添加到集合中
                    {
                        ints.Add(ran);
                    }
                }
 
            }
 
            for (int i = 0; i < ints.Count; i++) //输出集合中的数字,如果你要使用的话,也可以选择前几个数字
            {
                Console.WriteLine(ints[i]);
            }
           
            
 

这里使用时间是为了让他足够随机,因为我们的时间是在不断变化的,这样确保了种子的随机性,但random选取种子会有15ms的一个随机序列生成,时间很短,这也就会导致会有一定重复的可能性

为了剔除这种随机出来相同的数字,我们将出来不同的数字添加到集合中,来以此确保它不会重复。

 

附坑:

 注意下面的 跑的结果是100个一样的值,由于 执行过快,

 

 

  static void Main(string[] args)
        {
            var list = new List<int>();
            
            for (int i = 0; i < 100; i++)
            {
                list.Add(new Random().Next(0, 50));
            }

            list.ForEach((i) =>
            {
                Console.WriteLine(i);
            });

            Console.Read();
        }

如果把 new Random()提到for循环外就不一样,或者for中加Thread.Sleep(1)也有所不同

或者 换成   list.Add(new Random().GetHashCode());  

或者 new Random(Guid.NewGuid().GetHashCode())

或者  new Random(i * 5)

 

标签:数字,int,Random,线程,随机,new,相关
From: https://www.cnblogs.com/wwkk/p/16817670.html

相关文章

  • 欧拉图相关
    判定无向图欧拉路径:仅仅存在两个点度数为奇数,其余为偶数无向图欧拉回路:度数均为偶数图应该是连通的。有向图欧拉路径:存在两个点入度出度满足1/-1的增量,其余......
  • pandas里的缺失值(理解与相关方法)
    由于数据库或数据集中存在大量缺失数据和空值,这时在pandas中经常用NAN代替。pandas用标签方法表示缺失值:一:浮点数据类型的NaN值二:python的None对象其中,None是一个pytho......
  • 对于文件的相关基础操作的学习与总结
    String类在读写文件时,最不能忽略的是String数据类型的使用,那就先来说明一下String类型吧!1、charAt();2、compareTo();3、length();4、split();指定分割的份......
  • D. Problem with Random Tests
    D.ProblemwithRandomTestsYouaregivenastring$s$consistingof$n$characters.Eachcharacterof$s$iseither$0$or$1$.Asubstringof$s$isaconti......
  • R语言单变量和多变量(多元)动态条件相关系数DCC-GARCH模型分析股票收益率金融时间序列数
    全文下载链接:http://tecdat.cn/?p=25957当您处理金融时间序列时,我们通常可以获得相对高频的观察结果。例如,每天进行观察是很常见的。事实上,现在可以获得每小时、分钟、秒......
  • 【Middleware】中间件与相关工具
    DockerCompose中的两个重要概念:服务(service):一个应用容器,实际上可以运行多个相同镜像的实例。项目(project):由一组关联的应用容器组成的一个完整业务单元。Compose......
  • React相关《下》
    React组件有几种特殊方法,它们提供了在组件生命周期中的特定点执行操作的机会,它们被称为生命周期方法或生命周期钩子,允许我们在特定时间点捕获组件,比如在组件被渲染之前、更......
  • unityID手机绑定相关问题
    关于unityID绑定手机号常见问题:1.想要更换新的手机号,且旧的手机号还在用的情况下,可以自行在账户管理页面更改。    2.若旧手机没有使用了,只能联系supportchina@u......
  • HDFS相关问题处理
    机房搬迁后datanode启动失败,报错如下:2022-10-2110:28:40,551INFOorg.apache.hadoop.hdfs.server.common.Storage:Lockon/HDATA/1/dfs/local/in_use.lockacquired......
  • 面试题vue组件的相关问题
    面试题vue组件的相关问题什么是组件什么是组件:组件(Component)是Vue.js最强大的功能之一。组件可以扩展HTML元素,封装可重用的代码。一个页面可以由多个组件构成,......