ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 9162|回复: 8

[求助] 随机数问题求助,迷茫............

[复制链接]

TA的精华主题

TA的得分主题

发表于 2009-12-20 22:31 | 显示全部楼层 |阅读模式
  1. Sub rnd5()
  2.     Dim i As Byte
  3.     For i = 1 To 3
  4.         Debug.Print rnd
  5.     Next
  6. End Sub
复制代码
以上代码,按随机数的原理来说,每次启动都应该产生相同的随机数序列吧?可是在vba中却不一样(VB中测试倒是一样的)
何解呢?难道是vba比vb在随机数产生上多了个什么机制?

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-12-20 22:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
sorry,是我测试的问题,呵呵,是取得相同随机数序列,对不起大家

TA的精华主题

TA的得分主题

发表于 2009-12-20 22:34 | 显示全部楼层
每次启动都应该产生相同的随机数序列吧?
===
不应该吧

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-12-20 23:17 | 显示全部楼层
打开工作,运行产生随机数(记下此随机数,注意是第一次运行的)
保存关闭工作簿,再次运行之,和上次得到的三个随机数对应位置一样的
我测试的:
.7055475
.533424
.5795186
试试,或许我们的随机数表(乱数表)是一样的,呵呵

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-12-20 23:20 | 显示全部楼层

今天的学习内容,一起看看O(∩_∩)O~

VB随机数

相信很多人也用過VB 產生隨機數,因為在絕大部分的VB 課程中也會提及過,在部分參考書中這也是不可缺少的課題。 相信很多人也用过VB产生随机数,因为在绝大部分的VB课程中也会提及过,在部分参考书中这也是不可缺少的课题。

隨機數可以做出不少有趣的效果:如隨機轉換色彩、隨機選擇。 随机数可以做出不少有趣的效果:如随机转换色彩、随机选择。 究竟我們瞭解VB 隨機數多少呢? 究竟我们了解VB随机数多少呢? 讓我們來一起探討吧。 让我们来一起探讨吧。

Rnd 函數: Rnd函数:

Rnd 函數可以回傳一個資料型別為Single 的數值,此數值必定大過或等於0 及比1 小 ,但最大值是甚麼呢? Rnd函数可以回传一个资料型别为Single的数值,此数值必定大过或等于0及比1小 ,但最大值是什么呢? 因為那數值是Single 型別,有效位數是7﹝請參考「 電腦資料類型 」﹞,所以照理該是0.9999999,但實際上卻不是,這遲些再探討吧。 因为那数值是Single型别,有效位数是7﹝请参考「 电脑资料类型 」﹞,所以照理该是0.9999999,但实际上却不是,这迟些再探讨吧。

先看看最簡單的隨機數程式,在表單上設一CommandButton,然後嘗試執行以下程式: 先看看最简单的随机数程式,在表单上设一CommandButton,然后尝试执行以下程式:

Print Rnd Print Rnd

在我的電腦上所印出的結果是: 在我的电脑上所印出的结果是:

0.7055475 0.7055475

0.533424 0.533424

0.5795186 0.5795186

0.2895625 0.2895625

0.301948 0.301948

如果重新執行一次程式的話,隨機數的出現次序也會是一樣。如果重新执行一次程式的话,随机数的出现次序也会是一样。

為甚麼呢?为什么呢? 原來在電腦中有一樣東西叫「亂數表」,Rnd 函數只是要求亂數表給亂數,而亂數表會依序的把亂數給Rnd 函數,所以才會出現這現象。原来在电脑中有一样东西叫「乱数表」,Rnd函数只是要求乱数表给乱数,而乱数表会依序的把乱数给Rnd函数,所以才会出现这现象。 為了可以使隨機數在每一次也不同,我們都會給亂數表設定一個亂數種子,絕大部分的編程員更會以現在的時間作為亂數種子,以更新亂數表。为了可以使随机数在每一次也不同,我们都会给乱数表设定一个乱数种子,绝大部分的编程员更会以现在的时间作为乱数种子,以更新乱数表。 這樣每次執行程式時亂數表都會給不同的隨機數了。这样每次执行程式时乱数表都会给不同的随机数了。

而設定亂數種子可以用VB 內的Randomize 方法:而设定乱数种子可以用VB内的Randomize方法:

Randomize 方法的格式: Randomize方法的格式:

Randomize([Number]) Randomize([Number])

中括號內的參數是指可以不輸入,如果沒有輸入的話便會取其預設值,而Number 參數的預設值正是現在的時間﹝Timer﹞。中括号内的参数是指可以不输入,如果没有输入的话便会取其预设值,而Number参数的预设值正是现在的时间﹝Timer﹞。

Randomize Timer Randomize Timer

Print Rnd Print Rnd

用以上程式便可以在執行程式時印出不同的隨機數。用以上程式便可以在执行程式时印出不同的随机数。

好了,花了太多篇幅說明用VB 求亂數的基本概念,是時候入正題說一說如何應用了。好了,花了太多篇幅说明用VB求乱数的基本概念,是时候入正题说一说如何应用了。

1. 讀取某一範圍內的隨機整數: 1.读取某一范围内的随机整数:

假設我們要讀取0 ~ 10 內的隨機整數,資料類型為Integer,程式如下:假设我们要读取0 ~ 10内的随机整数,资料类型为Integer,程式如下:

Dim I As Integer Dim I As Integer

Randomize Timer Randomize Timer

I = CInt(Int(Rnd * 11)) I = CInt(Int(Rnd * 11))

* Int 函數可以除去小數的點數部分,如: * Int函数可以除去小数的点数部分,如:

Int(4.99) Int(4.99)

Int(4.11) Int(4.11)

兩個的回傳值也是4。两个的回传值也是4。

* CInt 函數可以使資料強迫性轉換成Integer 型別,因為Int 函數的回傳值的資料類型是Variant,因此它的型別會受它的參數影響,從以上程式,Int(Rnd * 11) 的回傳值的資料類型將會是Single。 * CInt函数可以使资料强迫性转换成Integer型别,因为Int函数的回传值的资料类型是Variant,因此它的型别会受它的参数影响,从以上程式,Int(Rnd * 11)的回传值的资料类型将会是Single。

因為Rnd 函數所回傳的值必定比1 少,所以Rnd * 11 必定不會等於11,因此加上Int 函數時,最大值將會是10;而下限當然是0,因此便可以隨機求出0 ~ 10 內的隨機整數了。因为Rnd函数所回传的值必定比1少,所以Rnd * 11必定不会等于11,因此加上Int函数时,最大值将会是10;而下限当然是0,因此便可以随机求出0 ~ 10内的随机整数了。

如果我們想要出1 ~ 10的的隨機整數的話,只要先求出0 ~ 9 的隨機整數,再將它們加1 便是1 ~ 10 了,所以程式是:如果我们想要出1 ~ 10的的随机整数的话,只要先求出0 ~ 9的随机整数,再将它们加1便是1 ~ 10了,所以程式是:

Dim I As Integer Dim I As Integer

Randomize Timer Randomize Timer

I = CInt(Int(Rnd * 10) + 1) I = CInt(Int(Rnd * 10) + 1)

因此我們得出以下求取隨機整數的公式:因此我们得出以下求取随机整数的公式:

變數= Int(Rnd * 隨機整數總數) + 下限 变数= Int(Rnd *随机整数总数) +下限

* CInt 函數是取決於該變數的資料類型。 * CInt函数是取决于该变数的资料类型。

2. 讀取某一範圍內的隨機數﹝帶有小數﹞: 2.读取某一范围内的随机数﹝带有小数﹞:

假設我們要讀取0 ~ 10 內的隨機數,及小數點後一位﹝有可能是整數﹞,程式如下:假设我们要读取0 ~ 10内的随机数,及小数点后一位﹝有可能是整数﹞,程式如下:

Dim S As Single Dim S As Single

Randomize Timer Randomize Timer

S = Round(Rnd * 10, 1) S = Round(Rnd * 10, 1)

*Round 函數的格式: *Round函数的格式:

Round(數值, [小數點後數位As Long]) Round(数值, [小数点后数位As Long])

*「小數點後數位」參數的預設值為0。 *「小数点后数位」参数的预设值为0。

Round(1.234, 2) Round(1.234, 2)

Round(1.567, 2) Round(1.567, 2)

Round(1.987, 2) Round(1.987, 2)

Round(1.999, 2) Round(1.999, 2)

以上的結果分別為1.23、1.57、1.99 與2。以上的结果分别为1.23、1.57、1.99与2。

因為Round 函數也是回傳Variant 型別,因此Round(Rnd * 10, 1) 便會回傳Single型別。因为Round函数也是回传Variant型别,因此Round(Rnd * 10, 1)便会回传Single型别。

因為Rnd * 10 的結果有可能是9.99x......,所以加上Round 函數後是有機會等於10。因为Rnd * 10的结果有可能是9.99x......,所以加上Round函数后是有机会等于10。

因此我們得出以下求取隨機小數的公式:因此我们得出以下求取随机小数的公式:

變數= Round(Rnd * 隨機整數總數- 1, 小數點後數位) + 下限 变数= Round(Rnd *随机整数总数- 1,小数点后数位) +下限

註:Round 函數在VB6 之前是沒有的,如果不能使用Round 函數的話可以選用Format 函數。注:Round函数在VB6之前是没有的,如果不能使用Round函数的话可以选用Format函数。 但這已超出了本章的範圍,請容許我不作解說,但大家還是可以在留言板中向我發問。但这已超出了本章的范围,请容许我不作解说,但大家还是可以在留言板中向我发问。

好了,現在大家可能在想Rnd 函數最多會有多少個變化吧,剛才我說過Rnd 函數的回傳值的上限一般是0.9999999,因此一般來說Rnd 函數是有10, 000, 000 ﹝一千萬﹞個變化,但其實此函數是有玄機的。好了,现在大家可能在想Rnd函数最多会有多少个变化吧,刚才我说过Rnd函数的回传值的上限一般是0.9999999,因此一般来说Rnd函数是有10, 000, 000 ﹝一千万﹞个变化,但其实此函数是有玄机的。

原來在亂數表中的亂數的有效位數是15,相等於Double 資料類型﹝請參考「 電腦資料類型 」﹞,即是說Rnd 函數未能完全發揮電腦亂數的彈性﹝雖然10, 000, 000 個變化已經十分多﹞,但其實是有辦法可以把Rnd 函數的傳回值在運算前將它轉換為Double 型別,方法是:原来在乱数表中的乱数的有效位数是15,相等于Double资料类型﹝请参考「 电脑资料类型 」﹞,即是说Rnd函数未能完全发挥电脑乱数的弹性﹝虽然10, 000 , 000个变化已经十分多﹞,但其实是有办法可以把Rnd函数的传回值在运算前将它转换为Double型别,方法是:

Print CDbl( Rnd ) Print CDbl( Rnd )

對!对! 只要用CDbl 函數將Rnd 由Single 型別轉換為Double 型別,那麼Rnd 函數的回傳值的上限便會增至0.999999999999999,同時亦可以產生1, 000, 000, 000, 000, 000 ﹝一千萬億﹞個變化了 。只要用CDbl函数将Rnd由Single型别转换为Double型别,那么Rnd函数的回传值的上限便会增至0.999999999999999,同时亦可以产生1, 000, 000, 000, 000, 000 ﹝一千万亿﹞个变化了 。

我花上了相當時間所求出的最大與最小的亂數分別是: 我花上了相当时间所求出的最大与最小的乱数分别是:

最大 :0.999999940395355 → 總共求了11, 529, 709 次才求到 最大 :0.999999940395355 →总共求了11, 529, 709次才求到

最小 :0.000241219997406006 → 總共求了125 次才求到 最小 :0.000241219997406006 →总共求了125次才求到

* 當然是由電腦代勞計算啊。 *当然是由电脑代劳计算啊。

字数超限,楼下继续,不是灌水O(∩_∩)O~

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-12-20 23:21 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

今天的学习内容(二),一起看看O(∩_∩)O~

quote]Option Explicit

'计算机中随机数的产生
'
'大家可能很多次讨论过随机数在计算机中怎样产生的问题,在这篇文章中,我会对这个问题进行更深入的探讨,阐述我对这个问题的理解。
'
'首先需要声明的是,计算机不会产生绝对随机的随机数,计算机只能产生“伪随机数”。

'其实绝对随机的随机数只是一种理想的随机数,即使计算机怎样发展,它也不会产生一串绝对随机的随机数。计算机只能生成相对的随机数,即伪随机数。
'
'伪随机数并不是假随机数,这里的“伪”是有规律的意思,就是计算机产生的伪随机数既是随机的又是有规律的。
   
'怎样理解呢?产生的伪随机数有时遵守一定的规律,有时不遵守任何规律;伪随机数有一部分遵守一定的规律;

'另一部分不遵守任何规律。比如“世上没有两片形状完全相同的树叶”,这正是点到了事物的特性,即随机性,

'但是每种树的叶子都有近似的形状,这正是事物的共性,即规律性。

'从这个角度讲,你大概就会接受这样的事实了:计算机只能产生伪随机数而不能产生绝对随机的随机数。
'
'那么计算机中随机数是怎样产生的呢?有人可能会说,随机数是由“随机种子”产生的。

'没错,随机种子是用来产生随机数的一个数,在计算机中,这样的一个“随机种子”是一个无符号整形数。那么随机种子是从哪里获得的呢?

'=========下面看这样一个C程序=======:

'//rand01.c
'#include<dos.h>
'
'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");
'}

'=======这个程序(rand01.c)完整地阐述了随机数产生的过程=========:

'首先,主程序调用random_start()方法:

'====================
'void random_start(void)
    '{
    'int temp[2];
    'movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4);
    'RAND_SEED=temp[0];
    '}
'====================
'random_start()方法中的这一句我很感兴趣:
'
'movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4);
'
'=======这个函数用来移动内存数据=========:
    'FP_SEG(far pointer to segment)是取temp数组段地址的函数
   
    'FP_OFF(far pointer to offset)是取temp数组相对地址的函数
   
    'movedata函数的作用是把位于0040:006CH存储单元中的双字放到数组temp的声明的两个存储单元中。
   
    '这样可以通过temp数组把0040:006CH处的一个16位的数送给RAND_SEED。
'=======================================
'random用来根据随机种子RAND_SEED的值计算得出随机数,其中这一句:
'
'RAND_SEED=(RAND_SEED*123+59)%65536;
'
'是用来计算随机数的方法,随机数的计算方法在不同的计算机中是不同的,即使在相同的计算机中安装的不同的操作系统中也是不同的。

'我在linux和windows下分别试过,相同的随机种子在这两种操作系统中生成的随机数是不同的,这说明它们的计算方法不同。
'
'现在,我们明白随机种子是从哪儿获得的,而且知道随机数是怎样通过随机种子计算出来的了。

'那么,随机种子为什么要在内存的0040:006CH处取?0040:006CH处存放的是什么?
'
'学过《计算机组成原理与接口技术》这门课的人可能会记得在编制ROM BIOS时钟中断服务程序时会用到Intel 8253定时/计数器,

'它与Intel 8259中断芯片的通信使得中断服务程序得以运转,主板每秒产生的18.2次中断正是处理器根据定时/记数器值控制中断芯片产生的。

'在我们计算机的主机板上都会有这样一个定时/记数器用来计算当前系统时间,每过一个时钟信号周期都会使记数器加一,而这个记数器的值存放在哪儿呢?

'没错,就在内存的0040:006CH处,其实这一段内存空间是这样定义的:
'
'TIMER_LOW DW ? ;地址为 0040:006CH
'TIMER_HIGH DW ? ;地址为 0040:006EH
'TIMER_OFT DB ? ;地址为 0040:0070H
'
'时钟中断服务程序中,每当TIMER_LOW转满时,此时,记数器也会转满,记数器的值归零,即TIMER_LOW处的16位二进制归零,而TIMER_HIGH加一。rand01.c中的
'
'movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4);
'
'正是把TIMER_LOW和TIMER_HIGH两个16位二进制数放进temp数组,再送往RAND_SEED,从而获得了“随机种子”。
'
'现在,可以确定的一点是,随机种子来自系统时钟,确切地说,是来自计算机主板上的定时/计数器在内存中的记数值。

'这样,我们总结一下前面的分析,并讨论一下这些结论在程序中的应用:
'
'1.随机数是由随机种子根据一定的计算方法计算出来的数值。所以,只要计算方法一定,随机种子一定,那么产生的随机数就不会变。

'看下面这个C 程序:
'
'//rand02.cpp
'#include <iostream>
'#include <ctime>
'using namespace std;
'
'int main()
    '{
    'unsigned int seed=5;
    'srand(seed);
    'unsigned int r=rand();
    'cout<<r<<endl;
    '}
'
'在相同的平台环境下,编译生成exe后,每次运行它,显示的随机数都是一样的。

'这是因为在相同的编译平台环境下,由随机种子生成随机数的计算方法都是一样的,再加上随机种子一样,所以产生的随机数就是一样的。

'2.只要用户或第三方不设置随机种子,那么在默认情况下随机种子来自系统时钟(即定时/计数器的值)

'看下面这个C 程序:
'
'//rand03.cpp
'#include <iostream>
'#include <ctime>
'using namespace std;
'
'int main()
    '{
    'srand((unsigned)time(NULL));
    'unsigned int r=rand();
    'cout<<r<<endl;
    'return 0;
    '}
'
'这里用户和其他程序没有设定随机种子,则使用系统定时/计数器的值做为随机种子,

'所以,在相同的平台环境下,编译生成exe后,每次运行它,显示的随机数会是伪随机数,即每次运行显示的结果会有不同。
'
'3.建议:如果想在一个程序中生成随机数序列,需要至多在生成随机数之前设置一次随机种子。

'看下面这个用来生成一个随机字符串的C 程序:
'
'//rand04.cpp
'#include<iostream>
'#include<time.h>
'using namespace std;
'int main()
'{
'int rNum,m=20;
'char *ch=new char[m];
'
'for ( int i = 0; i<m; i++ ){
'//大家看到了,随机种子会随着for循环在程序中设置多次
'srand((unsigned)time(NULL));
'rNum=1+(int)((rand()/(double)RAND_MAX)*36); //求随机值
'switch (rNum){
'case 1: ch='a';
'break ;
'case 2: ch='b';
'break ;
'case 3: ch='c';
'break ;
'case 4: ch='d';
'break ;
'case 5: ch='e';
'break ;
'case 6: ch='f';
'break ;
'case 7: ch='g';
'break ;
'case 8: ch='h';
'break ;
'case 9: ch='i';
'break ;
'case 10: ch='j';
'break ;
'case 11: ch='k';
'break ;
'case 12: ch='l';
'break ;
'case 13: ch='m';
'break ;
'case 14: ch='n';
'break ;
'case 15: ch='o';
'break ;
'case 16: ch='p';
'break ;
'case 17: ch='q';
'break ;
'case 18: ch='r';
'break ;
'case 19: ch='s';
'break ;
'case 20: ch='t';
'break ;
'case 21: ch='u';
'break ;
'case 22: ch='v';
'break ;
'case 23: ch='w';
'break ;
'case 24: ch='x';
'break ;
'case 25: ch='y';
'break ;
'case 26: ch='z';
'break ;
'case 27:ch='0';
'break;
'case 28:ch='1';
'break;
'case 29:ch='2';
'break;
'case 30:ch='3';
'break;
'case 31:ch='4';
'break;
'case 32:ch='5';
'break;
'case 33:ch='6';
'break;
'case 34:ch='7';
'break;
'case 35:ch='8';
'break;
'case 36:ch='9';
'break;
'}//end of switch
'cout<<ch;
'}//end of for loop
'
'cout<<endl;
'return 0;
'}
'
'而运行结果显示的随机字符串的每一个字符都是一样的,也就是说生成的字符序列不随机,

'所以我们需要把srand((unsigned)time(NULL)); 从for循环中移出放在for语句前面,

'这样可以生成随机的字符序列,而且每次运行生成的字符序列会不同(呵呵,也有可能相同,不过出现这种情况的几率太小了)。

'如果你把srand((unsigned)time(NULL));改成srand(2);这样虽然在一次运行中产生的字符序列是随机的,

'但是每次运行时产生的随机字符序列串是相同的?把srand这一句从程序中去掉也是这样?
'
'此外,你可能会遇到这种情况,在使用timer控件编制程序的时候会发现用相同的时间间隔生成的一组随机数会显得有规律,

'而由用户按键command事件产生的一组随机数却显得比较随机,为什么?根据我们上面的分析,你可以很快想出答案。

'这是因为timer是由计算机时钟记数器精确控制时间间隔的控件,时间间隔相同,记数器前后的值之差相同,这样时钟取值就是呈线性规律的,

'所以随机种子是呈线性规律的,生成的随机数也是有规律的。而用户按键事件产生随机数确实更呈现随机性,因为事件是由人按键引起的,

'而人不能保证严格的按键时间间隔,即使严格地去做,也不可能完全精确做到,只要时间间隔相差一微秒,记数器前后的值之差就不相同了,

'随机种子的变化就失去了线性规律,那么生成的随机数就更没有规律了,所以这样生成的一组随机数更随机。

'这让我想到了各种晚会的抽奖程序,如果用人来按键产生幸运观众的话,那就会很好的实现随机性原则,结果就会更公正。
'
'最后,我总结两个要点:

'1.计算机的伪随机数是由随机种子根据一定的计算方法计算出来的数值。所以,只要计算方法一定,随机种子一定,那么产生的随机数就是固定的。

'2.只要用户或第三方不设置随机种子,那么在默认情况下随机种子来自系统时钟。
'

今天晚上的学习内容,一起学习下,O(∩_∩)O~[/quote]

TA的精华主题

TA的得分主题

发表于 2009-12-20 23:31 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-1-16 22:04 | 显示全部楼层
有点明白了

Randomize
其实就是想改变种子,

'3.建议:如果想在一个程序中生成随机数序列,需要至多在生成随机数之前设置一次随机种子。
这里的至多一次是什么意思?

种子也是按timer 进行的,这个变化产生相同序列的可能性有多大

尤其当要求产生随机数的范围比较窄时?
水平有限请不要见怪哦

TA的精华主题

TA的得分主题

发表于 2018-3-23 13:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
用繁体字有点不友好
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-6-7 04:47 , Processed in 0.038596 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表