HOME 首頁
SERVICE 服務(wù)產(chǎn)品
XINMEITI 新媒體代運(yùn)營
CASE 服務(wù)案例
NEWS 熱點(diǎn)資訊
ABOUT 關(guān)于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    偽隨機(jī)數(shù)生成算法

    發(fā)布時(shí)間:2023-05-23 11:53:49     稿源: 創(chuàng)意嶺    閱讀: 71        

    大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于偽隨機(jī)數(shù)生成算法的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。KWc創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營銷策劃公司

    開始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對話答疑等等KWc創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營銷策劃公司

    只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,有小程序、在線網(wǎng)頁版、PC客戶端和批量生成器KWc創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營銷策劃公司

    問友Ai官網(wǎng):https://ai.de1919.comKWc創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營銷策劃公司

    本文目錄:KWc創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營銷策劃公司

    偽隨機(jī)數(shù)生成算法KWc創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營銷策劃公司

    什么是偽隨機(jī)數(shù)?KWc創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營銷策劃公司

    大家可能很多次討論過隨機(jī)數(shù)在計(jì)算機(jī)中怎樣產(chǎn)生的問題,在這篇文章中,我會對這個(gè)問題進(jìn)行更深入的探討,闡述我對這個(gè)問題的理解。
      首先需要聲明的是,計(jì)算機(jī)不會產(chǎn)生絕對隨機(jī)的隨機(jī)數(shù),計(jì)算機(jī)只能產(chǎn)生“偽隨機(jī)數(shù)”。其實(shí)絕對隨機(jī)的隨機(jī)數(shù)只是一種理想的隨機(jī)數(shù),即使計(jì)算機(jī)怎樣發(fā)展,它也不會產(chǎn)生一串絕對隨機(jī)的隨機(jī)數(shù)。計(jì)算機(jī)只能生成相對的隨機(jī)數(shù),即偽隨機(jī)數(shù)。
      偽隨機(jī)數(shù)并不是假隨機(jī)數(shù),這里的“偽”是有規(guī)律的意思,就是計(jì)算機(jī)產(chǎn)生的偽隨機(jī)數(shù)既是隨機(jī)的又是有規(guī)律的。怎樣理解呢?產(chǎn)生的偽隨機(jī)數(shù)有時(shí)遵守一定的規(guī)律,有時(shí)不遵守任何規(guī)律;偽隨機(jī)數(shù)有一部分遵守一定的規(guī)律;另一部分不遵守任何規(guī)律。比如“世上沒有兩片形狀完全相同的樹葉”,這正是點(diǎn)到了事物的特性,即隨機(jī)性,但是每種樹的葉子都有近似的形狀,這正是事物的共性,即規(guī)律性。從這個(gè)角度講,你大概就會接受這樣的事實(shí)了:計(jì)算機(jī)只能產(chǎn)生偽隨機(jī)數(shù)而不能產(chǎn)生絕對隨機(jī)的隨機(jī)數(shù)。
      那么計(jì)算機(jī)中隨機(jī)數(shù)是怎樣產(chǎn)生的呢?有人可能會說,隨機(jī)數(shù)是由“隨機(jī)種子”產(chǎn)生的。沒錯,隨機(jī)種子是用來產(chǎn)生隨機(jī)數(shù)的一個(gè)數(shù),在計(jì)算機(jī)中,這樣的一個(gè)“隨機(jī)種子”是一個(gè)無符號整形數(shù)。那么隨機(jī)種子是從哪里獲得的呢?
    下面看這樣一個(gè)C程序:
    //rand01.c
    #include
    static unsigned int RAND_SEED;
    unsigned int random(void)
    {
    RAND_SEED=(RAND_SEED*123+59)%65536;
    return(RAND_SEED);
    }
    void random_start(void)
    {
    int temp[2];
    movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4);
    RAND_SEED=temp[0];
    }
    main()
    {
    unsigned int i,n;
    random_start();
    for(i=0;i<10;i++)
    printf("%u\t",random());
    printf("\n");
    }
    這個(gè)程序(rand01.c)完整地闡述了隨機(jī)數(shù)產(chǎn)生的過程:
    首先,主程序調(diào)用random_start()方法,random_start()方法中的這一句我很感興趣:
    movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4);
    這個(gè)函數(shù)用來移動內(nèi)存數(shù)據(jù),其中FP_SEG(far pointer to segment)是取temp數(shù)組段地址的函數(shù),F(xiàn)P_OFF(far pointer to offset)是取temp數(shù)組相對地址的函數(shù),movedata函數(shù)的作用是把位于0040:006CH存儲單元中的雙字放到數(shù)組temp的聲明的兩個(gè)存儲單元中。這樣可以通過temp數(shù)組把0040:006CH處的一個(gè)16位的數(shù)送給RAND_SEED。
    random用來根據(jù)隨機(jī)種子RAND_SEED的值計(jì)算得出隨機(jī)數(shù),其中這一句:
    RAND_SEED=(RAND_SEED*123+59)%65536;
    是用來計(jì)算隨機(jī)數(shù)的方法,隨機(jī)數(shù)的計(jì)算方法在不同的計(jì)算機(jī)中是不同的,即使在相同的計(jì)算機(jī)中安裝的不同的操作系統(tǒng)中也是不同的。我在linux和windows下分別試過,相同的隨機(jī)種子在這兩種操作系統(tǒng)中生成的隨機(jī)數(shù)是不同的,這說明它們的計(jì)算方法不同。
      現(xiàn)在,我們明白隨機(jī)種子是從哪兒獲得的,而且知道隨機(jī)數(shù)是怎樣通過隨機(jī)種子計(jì)算出來的了。那么,隨機(jī)種子為什么要在內(nèi)存的0040:006CH處???0040:006CH處存放的是什么?
      學(xué)過《計(jì)算機(jī)組成原理與接口技術(shù)》這門課的人可能會記得在編制ROM BIOS時(shí)鐘中斷服務(wù)程序時(shí)會用到Intel 8253定時(shí)/計(jì)數(shù)器,它與Intel 8259中斷芯片的通信使得中斷服務(wù)程序得以運(yùn)轉(zhuǎn),主板每秒產(chǎn)生的18.2次中斷正是處理器根據(jù)定時(shí)/記數(shù)器值控制中斷芯片產(chǎn)生的。在我們計(jì)算機(jī)的主機(jī)板上都會有這樣一個(gè)定時(shí)/記數(shù)器用來計(jì)算當(dāng)前系統(tǒng)時(shí)間,每過一個(gè)時(shí)鐘信號周期都會使記數(shù)器加一,而這個(gè)記數(shù)器的值存放在哪兒呢?沒錯,就在內(nèi)存的0040:006CH處,其實(shí)這一段內(nèi)存空間是這樣定義的:
    TIMER_LOW DW ? ;地址為 0040:006CH
    TIMER_HIGH DW ? ;地址為 0040:006EH
    TIMER_OFT DB ? ;地址為 0040:0070H
    時(shí)鐘中斷服務(wù)程序中,每當(dāng)TIMER_LOW轉(zhuǎn)滿時(shí),此時(shí),記數(shù)器也會轉(zhuǎn)滿,記數(shù)器的值歸零,即TIMER_LOW處的16位二進(jìn)制歸零,而TIMER_HIGH加一。rand01.c中的
    movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4);
    正是把TIMER_LOW和TIMER_HIGH兩個(gè)16位二進(jìn)制數(shù)放進(jìn)temp數(shù)組,再送往RAND_SEED,從而獲得了“隨機(jī)種子”。
      現(xiàn)在,可以確定的一點(diǎn)是,隨機(jī)種子來自系統(tǒng)時(shí)鐘,確切地說,是來自計(jì)算機(jī)主板上的定時(shí)/計(jì)數(shù)器在內(nèi)存中的記數(shù)值。這樣,我們總結(jié)一下前面的分析,并討論一下這些結(jié)論在程序中的應(yīng)用:
    1.隨機(jī)數(shù)是由隨機(jī)種子根據(jù)一定的計(jì)算方法計(jì)算出來的數(shù)值。所以,只要計(jì)算方法一定,隨機(jī)種子一定,那么產(chǎn)生的隨機(jī)數(shù)就不會變。
    看下面這個(gè)C++程序:
    //rand02.cpp
    #include
    #include
    using namespace std;
    int main()
    {
    unsigned int seed=5;
    srand(seed);
    unsigned int r=rand();
    cout< // 編輯者注:可能代碼有缺
    }
    在相同的平臺環(huán)境下,編譯生成exe后,每次運(yùn)行它,顯示的隨機(jī)數(shù)都是一樣的。這是因?yàn)樵谙嗤木幾g平臺環(huán)境下,由隨機(jī)種子生成隨機(jī)數(shù)的計(jì)算方法都是一樣的,再加上隨機(jī)種子一樣,所以產(chǎn)生的隨機(jī)數(shù)就是一樣的。
    2.只要用戶或第三方不設(shè)置隨機(jī)種子,那么在默認(rèn)情況下隨機(jī)種子來自系統(tǒng)時(shí)鐘(即定時(shí)/計(jì)數(shù)器的值)
    看下面這個(gè)C++程序:
    //rand03.cpp
    #include
    #include
    using namespace std;
    int main()
    {
    srand((unsigned)time(NULL));
    unsigned int r=rand();
    cout< return 0;
    }
    這里用戶和其他程序沒有設(shè)定隨機(jī)種子,則使用系統(tǒng)定時(shí)/計(jì)數(shù)器的值做為隨機(jī)種子,所以,在相同的平臺環(huán)境下,編譯生成exe后,每次運(yùn)行它,顯示的隨機(jī)數(shù)會是偽隨機(jī)數(shù),即每次運(yùn)行顯示的結(jié)果會有不同。
    3.建議:如果想在一個(gè)程序中生成隨機(jī)數(shù)序列,需要至多在生成隨機(jī)數(shù)之前設(shè)置一次隨機(jī)種子。
    看下面這個(gè)用來生成一個(gè)隨機(jī)字符串的C++程序:
    //rand04.cpp
    #include
    #include
    using namespace std;
    int main()
    {
    int rNum,m=20;
    char *ch=new char[m];
    for ( int i = 0; i //大家看到了,隨機(jī)種子會隨著for循環(huán)在程序中設(shè)置多次
    srand((unsigned)time(NULL));
    rNum=1+(int)((rand()/(double)RAND_MAX)*36); //求隨機(jī)值
    switch (rNum){
    case 1: ch[i]='a';
    break ;
    case 2: ch[i]='b';
    break ;
    case 3: ch[i]='c';
    break ;
    case 4: ch[i]='d';
    break ;
    case 5: ch[i]='e';
    break ;
    case 6: ch[i]='f';
    break ;
    case 7: ch[i]='g';
    break ;
    case 8: ch[i]='h';
    break ;
    case 9: ch[i]='i';
    break ;
    case 10: ch[i]='j';
    break ;
    case 11: ch[i]='k';
    break ;
    case 12: ch[i]='l';
    break ;
    case 13: ch[i]='m';
    break ;
    case 14: ch[i]='n';
    break ;
    case 15: ch[i]='o';
    break ;
    case 16: ch[i]='p';
    break ;
    case 17: ch[i]='q';
    break ;
    case 18: ch[i]='r';
    break ;
    case 19: ch[i]='s';
    break ;
    case 20: ch[i]='t';
    break ;
    case 21: ch[i]='u';
    break ;
    case 22: ch[i]='v';
    break ;
    case 23: ch[i]='w';
    break ;
    case 24: ch[i]='x';
    break ;
    case 25: ch[i]='y';
    break ;
    case 26: ch[i]='z';
    break ;
    case 27:ch[i]='0';
    break;
    case 28:ch[i]='1';
    break;
    case 29:ch[i]='2';
    break;
    case 30:ch[i]='3';
    break;
    case 31:ch[i]='4';
    break;
    case 32:ch[i]='5';
    break;
    case 33:ch[i]='6';
    break;
    case 34:ch[i]='7';
    break;
    case 35:ch[i]='8';
    break;
    case 36:ch[i]='9';
    break;
    }//end of switch
    cout< }//end of for loop
    cout< return 0;
    }
    而運(yùn)行結(jié)果顯示的隨機(jī)字符串的每一個(gè)字符都是一樣的,也就是說生成的字符序列不隨機(jī),所以我們需要把srand((unsigned)time(NULL)); 從for循環(huán)中移出放在for語句前面,這樣可以生成隨機(jī)的字符序列,而且每次運(yùn)行生成的字符序列會不同(呵呵,也有可能相同,不過出現(xiàn)這種情況的幾率太小了)。
    如果你把srand((unsigned)time(NULL));改成srand(2);這樣雖然在一次運(yùn)行中產(chǎn)生的字符序列是隨機(jī)的,但是每次運(yùn)行時(shí)產(chǎn)生的隨機(jī)字符序列串是相同的。把srand這一句從程序中去掉也是這樣。
      此外,你可能會遇到這種情況,在使用timer控件編制程序的時(shí)候會發(fā)現(xiàn)用相同的時(shí)間間隔生成的一組隨機(jī)數(shù)會顯得有規(guī)律,而由用戶按鍵command事件產(chǎn)生的一組隨機(jī)數(shù)卻顯得比較隨機(jī),為什么?根據(jù)我們上面的分析,你可以很快想出答案。這是因?yàn)閠imer是由計(jì)算機(jī)時(shí)鐘記數(shù)器精確控制時(shí)間間隔的控件,時(shí)間間隔相同,記數(shù)器前后的值之差相同,這樣時(shí)鐘取值就是呈線性規(guī)律的,所以隨機(jī)種子是呈線性規(guī)律的,生成的隨機(jī)數(shù)也是有規(guī)律的。而用戶按鍵事件產(chǎn)生隨機(jī)數(shù)確實(shí)更呈現(xiàn)隨機(jī)性,因?yàn)槭录怯扇税存I引起的,而人不能保證嚴(yán)格的按鍵時(shí)間間隔,即使嚴(yán)格地去做,也不可能完全精確做到,只要時(shí)間間隔相差一微秒,記數(shù)器前后的值之差就不相同了,隨機(jī)種子的變化就失去了線性規(guī)律,那么生成的隨機(jī)數(shù)就更沒有規(guī)律了,所以這樣生成的一組隨機(jī)數(shù)更隨機(jī)。這讓我想到了各種晚會的抽獎程序,如果用人來按鍵產(chǎn)生幸運(yùn)觀眾的話,那就會很好的實(shí)現(xiàn)隨機(jī)性原則,結(jié)果就會更公正。
    最后,我總結(jié)兩個(gè)要點(diǎn):
    1.計(jì)算機(jī)的偽隨機(jī)數(shù)是由隨機(jī)種子根據(jù)一定的計(jì)算方法計(jì)算出來的數(shù)值。所以,只要計(jì)算方法一定,隨機(jī)種子一定,那么產(chǎn)生的隨機(jī)數(shù)就是固定的。
    2.只要用戶或第三方不設(shè)置隨機(jī)種子,那么在默認(rèn)情況下隨機(jī)種子來自系統(tǒng)時(shí)鐘。

    偽隨機(jī)數(shù)生成算法KWc創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營銷策劃公司

    計(jì)算機(jī)產(chǎn)生偽隨機(jī)數(shù)的周期是多少?算法是什么KWc創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營銷策劃公司

      為追求真正的隨機(jī)序列,人們曾采用很多種原始的物理方法用于生成一定范圍內(nèi)滿足精度(位數(shù))的均勻分布序列,其缺點(diǎn)在于:速度慢、效率低、需占用大量存儲空間且不可重現(xiàn)等。為滿足計(jì)算機(jī)模擬研究的需求,人們轉(zhuǎn)而研究用算法生成模擬各種概率分布的偽隨機(jī)序列。偽隨機(jī)數(shù)是指用數(shù)學(xué)遞推公式所產(chǎn)生的隨機(jī)數(shù)。從實(shí)用的角度看,獲取這種數(shù)的最簡單和最自然的方法是利用計(jì)算機(jī)語言的函數(shù)庫提供的隨機(jī)數(shù)發(fā)生器。典型情況下,它會輸出一個(gè)均勻分布在0和1區(qū)間內(nèi)的偽隨機(jī)變量的值。其中應(yīng)用的最為廣泛、研究最徹底的一個(gè)算法即線性同余法。
      線性同余法LCG(Linear Congruence Generator)
      選取足夠大的正整數(shù)M和任意自然數(shù)n0,a,b,由遞推公式:
      ni+1=(af(ni)+b)mod M i=0,1,…,M-1
      生成的數(shù)值序列稱為是同余序列。當(dāng)函數(shù)f(n)為線性函數(shù)時(shí),即得到線性同余序列:
      ni+1=(a*ni+b)mod M i=0,1,…,M-1
      以下是線性同余法生成偽隨機(jī)數(shù)的偽代碼:
      Random(n,m,seed,a,b)
      {
      r0 = seed;
      for (i = 1;i<=n;i++)
      ri = (a*ri-1 + b) mod m
      }
      其中種子參數(shù)seed可以任意選擇,常常將它設(shè)為計(jì)算機(jī)當(dāng)前的日期或者時(shí)間;m是一個(gè)較大數(shù),可以把它取為2w,w是計(jì)算機(jī)的字長;a可以是0.01w和0.99w之間的任何整數(shù)。
      應(yīng)用遞推公式產(chǎn)生均勻分布隨機(jī)數(shù)時(shí),式中參數(shù)n0,a,b,M的選取十分重要。
      例如,選取M=10,a=b =n0=7,生成的隨機(jī)序列為{6,9,0,7,6,9,……},周期為4。
      取M=16,a=5,b =3,n0=7,生成的隨機(jī)序列為{6,1,8,11,10,5,12,15,14,9,0,3,2,13,4,7,6,1……},周期為16。
      取M=8,a=5,b =1,n0=1,生成的隨機(jī)序列為{6,7,4,5,2,3,0,1,6,7……},周期為8。
      Visual C++中偽隨機(jī)數(shù)生成機(jī)制
      用VC產(chǎn)生隨機(jī)數(shù)有兩個(gè)函數(shù),分別為rand(void)和srand(seed)。rand()產(chǎn)生的隨機(jī)整數(shù)是在0~RAND_MAX之間平均分布的,RAND_MAX是一個(gè)常量(定義為:#define RAND_MAX 0x7fff)。它是short型數(shù)據(jù)的最大值,如果要產(chǎn)生一個(gè)浮點(diǎn)型的隨機(jī)數(shù),可以將rand()/1000.0,這樣就得到一個(gè)0~32.767之間平均分布的隨機(jī)浮點(diǎn)數(shù)。如果要使得范圍大一點(diǎn),那么可以通過產(chǎn)生幾個(gè)隨機(jī)數(shù)的線性組合來實(shí)現(xiàn)任意范圍內(nèi)的平均分布的隨機(jī)數(shù)。
      其用法是先調(diào)用srand函數(shù),如
      srand( (unsigned)time( NULL ) )
      這樣可以使得每次產(chǎn)生的隨機(jī)數(shù)序列不同。如果計(jì)算偽隨機(jī)序列的初始數(shù)值(稱為種子)相同,則計(jì)算出來的偽隨機(jī)序列就是完全相同的。要解決這個(gè)問題,需要在每次產(chǎn)生隨機(jī)序列前,先指定不同的種子,這樣計(jì)算出來的隨機(jī)序列就不會完全相同了。以time函數(shù)值(即當(dāng)前時(shí)間)作為種子數(shù),因?yàn)閮纱握{(diào)用rand函數(shù)的時(shí)間通常是不同的,這樣就可以保證隨機(jī)性了。也可以使用srand函數(shù)來人為指定種子數(shù)分析以下兩個(gè)程序段,
      程序段1:
      //包含頭文件
      void main() {
      int count=0;
      for (int i=0;i<10;i++){
      srand((unsigned)time(NULL));
      count++;
      cout<<"No"<
      //包含頭文件
      void main() {
      int count=0;
      srand((unsigned)time(NULL));
      for (int i=0;i<10;i++){
      count++;
      cout<<"No"<
      No1=9694 No2=9694 No3=9694 No4=9694 No5=9694
      No6=9694 No7=9694 No8=9694 No9=9694 No10=9694
      程序段2的運(yùn)行結(jié)果為:
      No1=10351 No2=444 No3=11351 No4=3074 No5=21497
      No6=30426 No7=6246 No8=24614 No9=22089 No10=21498
      可以發(fā)現(xiàn),以上兩個(gè)程序段由于隨機(jī)數(shù)生成時(shí)選擇的種子的不同,運(yùn)行的結(jié)果也不一樣。rand()函數(shù)返回隨機(jī)數(shù)序列中的下一個(gè)數(shù)(實(shí)際上是一個(gè)偽隨機(jī)數(shù)序列,序列中的每一個(gè)數(shù)是由對其前面的數(shù)字進(jìn)行復(fù)雜變換得到的)。為了模仿真正的隨機(jī)性,首先要調(diào)用srand()函數(shù)給序列設(shè)置一個(gè)種子。為了更好地滿足隨機(jī)性,使用了時(shí)間函數(shù)time(),以便取到一個(gè)隨時(shí)間變化的值,使每次運(yùn)行rand()函數(shù)時(shí)從srand()函數(shù)所得到的種子值不相同。偽隨機(jī)數(shù)生成器將作為"種子"的數(shù)當(dāng)作初始整數(shù)傳給函數(shù)。這粒種子會使這個(gè)球(生成偽隨機(jī)數(shù))一直滾下去。
      程序段1中由于將srand()函數(shù)放在循環(huán)體內(nèi),而程序執(zhí)行的CPU時(shí)間較快,調(diào)用time函數(shù)獲取的時(shí)間精度卻較低(55ms),這樣循環(huán)體內(nèi)每次產(chǎn)生隨機(jī)數(shù)用到的種子數(shù)都是一樣的,因此產(chǎn)生的隨機(jī)數(shù)也是一樣的。而程序段2中第1次產(chǎn)生的隨機(jī)數(shù)要用到隨機(jī)種子,以后的每次產(chǎn)生隨機(jī)數(shù)都是利用遞推關(guān)系得到的。 基于MFC的隨機(jī)校驗(yàn)碼生成
      Web應(yīng)用程序中經(jīng)常要利用到隨機(jī)校驗(yàn)碼,校驗(yàn)碼的主要作用是防止黑客利用工具軟件在線破譯用戶登錄密碼,校驗(yàn)碼、用戶名、密碼三者配合組成了進(jìn)入Web應(yīng)用系統(tǒng)的鑰匙。在利用VC開發(fā)的基于客戶機(jī)/瀏覽器(Client/Server)模式的應(yīng)用軟件系統(tǒng)中,為了防止非法用戶入侵系統(tǒng),通常也要運(yùn)用隨機(jī)校驗(yàn)碼生成技術(shù)。

    以上就是關(guān)于偽隨機(jī)數(shù)生成算法相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。KWc創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營銷策劃公司


    推薦閱讀:

    偽隨機(jī)數(shù)計(jì)算公式

    偽隨機(jī)數(shù)生成器破解

    偽隨機(jī)數(shù)生成算法

    舉報(bào)抖音軟件有效方法(舉報(bào)抖音軟件有效方法有哪些)

    大連東軟信息學(xué)院課程平臺(大連東軟信息學(xué)院課程資源)