日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

随机系列生成算法(随机数生成)

發(fā)布時間:2023/12/10 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 随机系列生成算法(随机数生成) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、問題描述

????????給定一個正整數(shù)n,需要輸出一個長度為n的數(shù)組,數(shù)組元素是隨機(jī)數(shù),范圍為0 – n-1,且元素不能重復(fù)。比如 n = 3 時,需要獲取一個長度為3的數(shù)組,元素范圍為0-2。

2、準(zhǔn)備

??????????首先,讓我們先構(gòu)造如下函數(shù):

[cpp]?view plaincopy
  • //隨機(jī)數(shù)生成函數(shù),生成[a,b]之間的一個隨機(jī)數(shù)字??
  • //其中0<=a<b<=RAND_MAX(即2^15-1=32767)??
  • int?random(int?a,int?b)??
  • {??
  • ????return?a+rand()%(b-a+1);??
  • }??

  • 3、解法一

    ??????????先給序列A[0...n-1]賦值,A[i]=i;(0=<i<n)。然后為每個元素A[i]賦一個優(yōu)先級P[i],然后依據(jù)優(yōu)先級對序列A進(jìn)行排序。這里要保證序列P中沒有相同的元素,所以P[i]的取值范圍可以選[0,(n-1)^3]。這樣就盡可能保證P中元素?zé)o重復(fù)。偽代碼如下:

    [cpp]?view plaincopy
  • n=length[A]??
  • for(i=0;i<n;i++)??
  • ???P[i]=random(0,n^3);??
  • sort?A,using?p?as?sort?keys??
  • ????????? 分析:顯然解法一無法準(zhǔn)確的確保P中元素?zé)o重復(fù),且當(dāng)n較大時,n的三次方會很大,如當(dāng)n=10000時,n的三次方已經(jīng)超出了無符號長整形的表示范圍。該算法時間復(fù)雜度依賴排序時間,且這個排序不好實現(xiàn)。總之,這不是一個很好的隨機(jī)序列生成算法。

    4、解法二

    ????????先給序列A[0...n-1]賦值,A[i]=i;(0=<i<n)。然后原地排列給定序列。代碼如下:

    [cpp]?view plaincopy
  • //產(chǎn)生隨機(jī)序列??
  • void?randomSequence1(int?*a,int?n)??
  • {??
  • ????int?i,r,temp;??
  • ????for(i=0;i<n;i++)??
  • ????????a[i]=i;??
  • ????srand(time(NULL));??
  • ????for(i=0;i<n;i++){??
  • ????????r=random(i,n-1);??
  • ????????//交換??
  • ????????temp=a[i];??
  • ????????a[i]=a[r];??
  • ????????a[r]=temp;??
  • ????}????
  • }??
  • ?????????分析:這個算法的時間復(fù)雜度為o(n)。

    5、解法三

    ????????這是在網(wǎng)上看的一種高效隨機(jī)生成序列算法,詳細(xì)請看原文:http://www.cnblogs.com/eaglet/archive/2011/01/17/1937083.html

    ????????這里給出自己寫的代碼:

    [cpp]?view plaincopy
  • //產(chǎn)生隨機(jī)序列??
  • void?randomSequence2(int?*a,int?n)??
  • {??
  • ????int?i,end,r;??
  • ????int?*q=(int?*)malloc(sizeof(int)*n);??
  • ????for(i=0;i<n;i++)??
  • ????????q[i]=i;??
  • ????srand(time(NULL));??
  • ????end=n-1;??
  • ????for(i=0;i<n;i++){??
  • ????????r=random(0,end);??
  • ????????a[i]=r;??
  • ????????q[r]=q[end];??
  • ????????end--;??
  • ????}????
  • }??
  • 6、附錄


    ??????參考書籍:《算法導(dǎo)論》?????解法三原文:http://www.cnblogs.com/eaglet/archive/2011/01/17/1937083.html

    轉(zhuǎn)載于:https://www.cnblogs.com/tham/p/6827184.html

    總結(jié)

    以上是生活随笔為你收集整理的随机系列生成算法(随机数生成)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。