成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

你如何生成m個(gè)數(shù)讓其和等于n

開發(fā) 開發(fā)工具
這種方案利用了非負(fù)這個(gè)不顯眼的條件,思路非常簡(jiǎn)單,就是將1隨即加到一個(gè)26位數(shù)組中,隨即301次,有點(diǎn)劍走偏鋒,另辟蹊徑,讓人耳目一新阿,有謀有啊有謀有!

今天看到了一個(gè)比較有意思的算法題,其實(shí)更有意思的是其解法,讓人頓時(shí)有一種耳目一新的感覺,愛不釋手,拿來分享一下。

題目:假設(shè)生成26個(gè)非負(fù)隨即數(shù),要求其和是301,求程序生成此列數(shù)字

哈哈,元芳,你如何看?

解法一: 關(guān)于此種算法原理,我們可以假想是一根長(zhǎng)301單位的繩子,然后隨即在其上面截25個(gè)點(diǎn),于是得到26根子繩,這26根子繩之和恰好就是繩子總長(zhǎng)301。

于是,我們可以:

初始化27的數(shù)組

該數(shù)組0位和26位分別為0和301,其他位置填充0到301之間的隨即數(shù)字

對(duì)數(shù)組排序

數(shù)組相鄰數(shù)字相減,所得的26個(gè)差值即為所求數(shù)列。

  1. class Random301   
  2.    {   
  3.        static void Main(string[] args)   
  4.        {   
  5.        int[] arryTemp=new int[27];   
  6.        int[] arryRandom = new int[26];   
  7.        //get random number,from 0 to 301   
  8.        Random ran=new Random((int)DateTime.Now.Ticks);   
  9.        arryTemp[0] = 0;   
  10.        arryTemp[26] = 301;   
  11.        for (int i = 1; i < 26; i++)   
  12.        {   
  13.            arryTemp[i] = ran.Next(0,301);   
  14.        }   
  15.            
  16.        //sort the arry   
  17.        int temp;   
  18.        for (int m = arryTemp.Length-1; m > 0; m--) {   
  19.            for (int n = 0; n < m;n++ ) {   
  20.                if (arryTemp[m] < arryTemp[n]) {    
  21.                     temp=arryTemp[n];   
  22.                     arryTemp[n] = arryTemp[m];   
  23.                     arryTemp[m] = temp;   
  24.                }   
  25.            }   
  26.        }   
  27.        //get the lastest random arry   
  28.        for (int j = 0; j < arryRandom.Length;j++) {   
  29.            arryRandom[j] = arryTemp[j + 1] - arryTemp[j];   
  30.        }   
  31.           
  32.        //check the arry   
  33.        int sum = 0;   
  34.        for (int k = 0; k < arryRandom.Length; k++) {   
  35.            sum = sum + arryRandom[k];   
  36.        }   
  37.        Console.WriteLine(sum);   
  38.        Console.ReadKey();   
  39.    }         
  40.    } 

解決方案二,這種方案利用了非負(fù)這個(gè)不顯眼的條件,思路非常簡(jiǎn)單,就是將1隨即加到一個(gè)26位數(shù)組中,隨即301次,有點(diǎn)劍走偏鋒,另辟蹊徑,讓人耳目一新阿,有謀有啊有謀有!

  1. class Radom301Arry   
  2.   {   
  3.       static void Main(string[] args) {   
  4.           int[] arryRandom = new int[26];   
  5.           Random ran = new Random();   
  6.           //add 1 301times into the arry   
  7.           for (int i = 0; i <301;i++ ) {   
  8.               arryRandom[ran.Next(026)]++;   
  9.           }   
  10.           //chenck the arry   
  11.           int sum = 0;   
  12.           for (int j = 0; j < arryRandom.Length; j++) {   
  13.               Console.WriteLine(arryRandom[j]);   
  14.               sum = sum + arryRandom[j];   
  15.           }   
  16.           Console.WriteLine("sum:"+sum);   
  17.           Console.ReadKey();   
  18.       }   
  19.   } 

多謝@另一個(gè)石頭,@八字和尚,@firstrose等等朋友的質(zhì)疑指證,我測(cè)試了一下,如果將數(shù)字增大,i <3000001,確實(shí)得出來的數(shù)字比較的平均,看來我扔了我這塊石頭確實(shí)引來了不少玉啊,嘿嘿,我仔細(xì)的看了下,第二種算法確實(shí)隱藏著缺陷,此方法的意圖是通過利用概率的隨機(jī)性,等于將301個(gè)1按照等概率分布在26個(gè)位置,random函數(shù)均勻拋出數(shù)字,所以其分布應(yīng)該大概按照301/26分布,在301次的時(shí)候其實(shí)已經(jīng)有表現(xiàn)了,當(dāng)數(shù)字變大此種現(xiàn)象更加明顯。

不過由于此種算法確實(shí)太過奇妙,所以我覺得用于小數(shù)字的隨機(jī)還是可以的,元芳,你怎么看呢?  

第三種解法:下象棋的朋友都知道一種常見的開局方式,兵三進(jìn)一或者兵七進(jìn)一,即仙人指路局,此種著法能進(jìn)能退,能起馬能飛炮,算起來中規(guī)中矩,其實(shí)也不乏一種方法,于是我也中規(guī)中矩的按照正常的思路又寫了一種所謂的“中規(guī)中矩”的算法:

  1. class List301   
  2.    {   
  3.        static void Main(string[] args) {   
  4.            //store the 26 random numbers   
  5.            List<int> templist = new List<int>();   
  6.            Random ran = new Random((int)DateTime.Now.Ticks);   
  7.            int temp = 0;   
  8.            int total = 301;   
  9.            for (int i = 0; i < 26; i++)   
  10.            {   
  11.                if (25 != i)   
  12.                    temp = ran.Next(0, total);   
  13.                else 
  14.                    temp = total;   
  15.                total = total - temp;   
  16.                templist.Add(temp);   
  17.            }     
  18.              int sum = 0;   
  19.            for (int m = 0; m <templist.Count; m++)   
  20.            {   
  21.                sum = sum + templist[m];   
  22.                Console.WriteLine(m+":"+templist[m]);   
  23.            }   
  24.            Console.WriteLine(sum);   
  25.            Console.ReadKey();   
  26.        }   
  27.    } 

這種方法就是先從0-301之間random出來一個(gè)數(shù)字,然后301減去此數(shù)字得出目前需要拋出數(shù)字的總和,然后再從0-目前總合中再random出來一個(gè)數(shù)字。。。如此知道第26個(gè)數(shù)字,不再random,直接賦值為***剩下的目前數(shù)字之和,測(cè)試后發(fā)現(xiàn)這個(gè)方法***會(huì)拋出大串的0,也在意料之中,因?yàn)殡S著random次數(shù)的增加,random的震蕩范圍越來越小,最終會(huì)在大于0附近徘徊。

鑒于此種現(xiàn)象,稍微改進(jìn)了一下方案,控制了一下random的震蕩范圍:

  1. class List301   
  2.    {   
  3.        static void Main(string[] args) {   
  4.            //store the 26 random numbers   
  5.            List<int> templist = new List<int>();   
  6.            Random ran = new Random((int)DateTime.Now.Ticks);   
  7.            int temp = 0;   
  8.            int total = 301;   
  9.            for (int i = 0; i < 26; i++)   
  10.            {   
  11.                if (25 != i)   
  12.                {   
  13.                    int avg = total / (26 - i);//控制震蕩范圍在動(dòng)態(tài)平均值附近   
  14.                    temp = ran.Next(0, avg * 2);   
  15.                    total = total - temp;   
  16.                }   
  17.                else 
  18.                    temp = total;   
  19.                templist.Add(temp);   
  20.            }   
  21.    
  22.            //check   
  23.            int sum = 0;   
  24.            for (int m = 0; m <templist.Count; m++)   
  25.            {   
  26.                sum = sum + templist[m];   
  27.                Console.WriteLine(m+":"+templist[m]);   
  28.            }               
  29.            Console.WriteLine(sum);   
  30.            Console.ReadKey();   
  31.        }   
  32.    } 

但是覺得這樣并不好,控制了震蕩范圍,就等于間接控制了隨機(jī)數(shù)字的出現(xiàn)概率,算來算去還是***種方法和第二種方法好,元芳,你認(rèn)為呢?

原文鏈接:http://www.cnblogs.com/songsz1/archive/2012/10/31/2748098.html

責(zé)任編輯:張偉 來源: 立雪三尺的博客
相關(guān)推薦

2010-08-25 17:56:23

N+XUPS

2014-11-05 10:58:00

編程

2010-02-01 22:34:23

無線路由器無線產(chǎn)品華碩

2011-08-19 14:43:42

Windows Ser

2018-03-30 10:02:08

代碼規(guī)范維護(hù)工程師

2013-07-12 13:24:19

App誘惑

2021-03-24 13:27:22

大數(shù)據(jù)Java薪資

2018-07-16 00:09:30

數(shù)據(jù)科學(xué)大數(shù)據(jù)機(jī)器學(xué)習(xí)

2013-07-05 13:48:47

App

2014-02-24 13:55:47

簡(jiǎn)歷簡(jiǎn)歷技巧

2019-09-17 14:31:52

JSJavaScript前端

2020-09-29 07:54:05

Express 飛起

2020-05-21 08:53:12

Python技術(shù)代碼

2009-10-27 09:17:26

VB.NET生成靜態(tài)頁

2013-03-06 09:59:34

云SLA管理服務(wù)水平協(xié)議SLA

2021-09-03 13:35:54

服務(wù)器服務(wù)器蔓延管理服務(wù)器

2019-02-25 09:20:53

2016-01-14 18:11:50

SaaSSaaS應(yīng)用開發(fā)SaaS安全

2021-07-01 10:03:55

Distroless容器安全

2025-03-11 08:30:00

Pythonretrying代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久草中文在线 | 蜜桃免费av | 亚洲人在线播放 | 亚洲高清一区二区三区 | 久久久久久久久久久国产 | 狠狠爱免费视频 | 一区二区三区精品视频 | 亚洲在线久久 | 欧州一区二区 | 一级大片| 久久一区二区三区免费 | 视频一区二区三区四区五区 | 亚洲va国产日韩欧美精品色婷婷 | 欧美精品久久久 | 中文字幕在线网 | 国产精品美女久久久 | 亚洲网站在线观看 | 蜜臀网| 国产天堂 | 人人做人人澡人人爽欧美 | 欧美日韩成人一区二区 | 亚洲精品一区二区久 | 中文字幕二区 | 亚洲精品中文字幕在线观看 | 奇米影视在线 | 一区二区三区国产好 | 成人一区二区三区 | 欧美日韩电影一区二区 | 国产清纯白嫩初高生视频在线观看 | 精品国产一区久久 | 久久久影院 | 国产精品久久久久久久久久 | 日韩一区二区三区精品 | 欧美一区二区三 | 欧美激情精品久久久久久免费 | 亚洲男人的天堂网站 | 91中文字幕在线 | 免费看一级毛片 | 精品日韩在线观看 | 国产精品欧美一区二区三区 | 中文字幕精品一区二区三区在线 |