c#循环中产生伪随机数
程序员文章站
2023-01-09 22:28:42
这种结果的原因在于,random()函数的默认种子是时间,但在循环中产生随机数时,由于运算速度太快,用做种子的时间是相同的(毫秒级),因此产生的随机数序列是相同的,这样最终...
这种结果的原因在于,random()函数的默认种子是时间,但在循环中产生随机数时,由于运算速度太快,用做种子的时间是相同的(毫秒级),因此产生的随机数序列是相同的,这样最终的随机数就会相同。(基于“线性同余法”的随机数发生器)
解决方法是,产生一个全局唯一标识符,使用它的哈希值来做种子产生随机数。代码如下:
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.security.cryptography;
namespace calculation
{
public static class randomstatic
{
//产生[0,1)的随机小数
public static double producedblrandom()
{
random r = new random(guid.newguid().gethashcode());//使用guid的哈希值做种子
return r.nextdouble();
}
//产生制定范围内的随机整数
public static int produceintrandom(int minvalue, int maxvalue)
{
random r = new random(guid.newguid().gethashcode());
return r.next(minvalue, maxvalue + 1);
}
}
}
这样在循环中产生随机数就能基本保证其随机性了,使用该静态类的代码如下:
//使用上述静态类
private void button1_click_1(object sender, eventargs e)
{
for (int i = 0; i < 100; i++)
{
console.writeline(randomstatic.produceintrandom(0,100));
}
}
//使用默认时间种子
private void button2_click_1(object sender, eventargs e)
{
random r = new random();
for (int i = 0; i < 100; i++)
{
console.writeline(r.next(0,100));
}
}
上述代码中的第一个循环可以产生100个很好的位于0-100的随机数,而第二个循环,由于使用默认的时间种子,在这个循环中,产生的随机数序列明显具有相关性,可以将两个循环产生的随机数序列放在excel中,做成散点图,结果一目了然。本来想上传图片的,但csdn好像现在上传不了图片。
第一个循环的结果:
37
66
70
82
82
58
85
60
78
13
3
9
75
83
63
43
50
11
56
13
79
58
30
7
84
5
92
48
83
3
5
29
36
29
8
82
20
1
46
49
17
87
95
35
62
20
51
97
18
41
26
28
63
90
59
76
23
94
11
63
12
37
2
54
23
24
66
86
23
65
3
86
25
85
22
43
17
53
86
89
51
14
59
46
66
54
2
58
75
2
88
99
87
9
31
96
92
8
89
23
第二个循环的结果:
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
解决方法是,产生一个全局唯一标识符,使用它的哈希值来做种子产生随机数。代码如下:
复制代码 代码如下:
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.security.cryptography;
namespace calculation
{
public static class randomstatic
{
//产生[0,1)的随机小数
public static double producedblrandom()
{
random r = new random(guid.newguid().gethashcode());//使用guid的哈希值做种子
return r.nextdouble();
}
//产生制定范围内的随机整数
public static int produceintrandom(int minvalue, int maxvalue)
{
random r = new random(guid.newguid().gethashcode());
return r.next(minvalue, maxvalue + 1);
}
}
}
这样在循环中产生随机数就能基本保证其随机性了,使用该静态类的代码如下:
复制代码 代码如下:
//使用上述静态类
private void button1_click_1(object sender, eventargs e)
{
for (int i = 0; i < 100; i++)
{
console.writeline(randomstatic.produceintrandom(0,100));
}
}
//使用默认时间种子
private void button2_click_1(object sender, eventargs e)
{
random r = new random();
for (int i = 0; i < 100; i++)
{
console.writeline(r.next(0,100));
}
}
上述代码中的第一个循环可以产生100个很好的位于0-100的随机数,而第二个循环,由于使用默认的时间种子,在这个循环中,产生的随机数序列明显具有相关性,可以将两个循环产生的随机数序列放在excel中,做成散点图,结果一目了然。本来想上传图片的,但csdn好像现在上传不了图片。
第一个循环的结果:
37
66
70
82
82
58
85
60
78
13
3
9
75
83
63
43
50
11
56
13
79
58
30
7
84
5
92
48
83
3
5
29
36
29
8
82
20
1
46
49
17
87
95
35
62
20
51
97
18
41
26
28
63
90
59
76
23
94
11
63
12
37
2
54
23
24
66
86
23
65
3
86
25
85
22
43
17
53
86
89
51
14
59
46
66
54
2
58
75
2
88
99
87
9
31
96
92
8
89
23
第二个循环的结果:
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
43
下一篇: 真的很像
推荐阅读
-
C#中巧用妙法避免嵌套方式使用两个foreach循环
-
C#中for循环、while循环循环执行的方法
-
c#循环中产生伪随机数
-
python中scipy.stats产生随机数实例讲解
-
用vbs产生的若干个随机数并写入到一个.txt中的代码
-
C#在循环中使用Random时生成的随机数相同的解决办法
-
C#中巧用妙法避免嵌套方式使用两个foreach循环
-
PHP中怎么产生不重复随机数
-
PHP中的&传值引用的问题,在foreach循环的结果能帮解释下输出的结果原理是什么? c# foreach javascript foreach c foreach
-
python中scipy.stats产生随机数实例讲解