关于取随机数时产生的一个百思不得其解的问题!!!

泡泡鱼_ 2006-12-19 09:37:58
大家帮我看看

首先这是一个生成随机数的方法:
public static string GetRandom(int Sum,int Len)
{
string[] s = {"1","2","3","4","5","6","7","8","9"};
Random r = new Random();
string n = null;
int j = 0;
string p;
for(int i=0;i<Len;i++)
{
p =s[r.Next(0, s.Length)].ToString();
n+=p;
j+= Convert.ToInt32(p);
}
if(j>=Sum)
{
return GetRandom(Sum,Len);
}
return n;

}

让我百思不得其解的地方在下面的方法中调用上面的方法时,居然生成的随机数是一样的!!
public static void Test()
{
for(int i=0;i<8;i++)
{
base.Response.Write(GetRandom(420,50));
}
}

想请大家帮忙看看。在线等!!!
...全文
248 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
泡泡鱼_ 2006-12-20
  • 打赏
  • 举报
回复
to:chsl918(Story Book) HtoFire(冬天里的一把火)
谢谢,你的分析很精辟。虽然我曾经怀疑过类似的原因,但是因为我想两次数据获取之间的时间间隔应该不至于影响最终结果,所以把这个结论否决了。这都归结于我自己的理论知识不够扎实

to: liujia_0421(SnowLover)
很感谢你的解答,你的解答无疑让我证实了上面的朋友说的结论是正确的并且直接的解决了我的问题。谢谢!

to:net_lover(【孟子E章】)
我非常感谢你能在百忙之中给我建议。谢谢

最后:感谢所有给我建议的朋友们。谢谢你们。我的问题才得以解决!!!
hwyqy 2006-12-19
  • 打赏
  • 举报
回复
不带参数的构造是以时间为种子的(MSDN原话),你在循环中,时间相隔太短,所以种子是一样的,种子一样的话,产生的随机数序列是一样的。

楼上注意,随机数序列只和种子相关,起码和线程无关。我写过多线程调用,只要种子一样,序列还是一样的
runrunrun 2006-12-19
  • 打赏
  • 举报
回复
static Random r = new Random();
把r做成类的静态变量
chsl918 2006-12-19
  • 打赏
  • 举报
回复
to:真是搞不明白。为什么单次可以获取。但放在循环体中时却会得出一样的数据来!!!

C#生成的伪随机数应当和时间有关系。单步调试时,两次随机数产生的间隔特别长。一般大于1秒。但是程序运行的时候两次取得时间间隔太近了。可能小于1ms所以出来的就是一样的了。我曾经连续5万以上的随机数,每10个一组(每组由一个过程产生)。每组数据几乎都是一样的,但是组间的数据一般都是不同的。
当然我相信随机数的产生可能不仅与时间有关,可能还和进程,或线程标识有关。
liujia_0421 2006-12-19
  • 打赏
  • 举报
回复
自己做个实验应该就明白了...

public static void Test()
{
for(int i=0;i<8;i++)
{
base.Response.Write(GetRandom(420,50));
//每调用一次后,休眠10ms
System.Threading.Thread.Sleep(10);
}
}

这样得到的结果应该就不会一样了...
liujia_0421 2006-12-19
  • 打赏
  • 举报
回复
TO:真是搞不明白。为什么单次可以获取。但放在循环体中时却会得出一样的数据来!!!

因为Random r = new Random();
使用的是使用与时间相关的默认种子值,由于执行速度比较快,所以导致每次的种子值都一样,所以结果也就一样..

泡泡鱼_ 2006-12-19
  • 打赏
  • 举报
回复
to:net_lover(【孟子E章】)

我不是说在取随机数的时候生成的数字全是一样

是在第二步时:

public static void Test()
{
for(int i=0;i<8;i++)
{
base.Response.Write(GetRandom(420,50));//在这里获取随机数并输出。就会发现输出的8组数据全都是一样的!!!!
}
}

真是搞不明白。为什么单次可以获取。但放在循环体中时却会得出一样的数据来!!!
liujia_0421 2006-12-19
  • 打赏
  • 举报
回复
首先需要声明的是,计算机不会产生绝对随机的随机数,计算机只能产生“伪随机数”。其实绝对随机的随机数只是一种理想的随机数,即使计算机怎样发展,它也不会产生一串绝对随机的随机数。计算机只能生成相对的随机数,即伪随机数。

伪随机数并不是假随机数,这里的“伪”是有规律的意思,就是计算机产生的伪随机数既是随机的又是有规律的。怎样理解呢?产生的伪随机数有时遵守一定的规律,有时不遵守任何规律;伪随机数有一部分遵守一定的规律;另一部分不遵守任何规律。比如“世上没有两片形状完全相同的树叶”,这正是点到了事物的特性,即随机性,但是每种树的叶子都有近似的形状,这正是事物的共性,即规律性。从这个角度讲,你大概就会接受这样的事实了:计算机只能产生伪随机数而不能产生绝对随机的随机数。
liujia_0421 2006-12-19
  • 打赏
  • 举报
回复
可以将Random 定义成一个全局变量,在函数体外实例化...

这样可以得到不同的..
liujia_0421 2006-12-19
  • 打赏
  • 举报
回复
一点也不奇怪...

说是随机数,其实是伪随机数..
chsl918 2006-12-19
  • 打赏
  • 举报
回复
我也遇到了类似的问题,有谁知道为什么么?
孟子E章 2006-12-19
  • 打赏
  • 举报
回复


for (int i = 0; i < 8; i++)
{
Random rnd = new Random(i * unchecked((int)DateTime.Now.Ticks) + i);
int r2 = rnd.Next();
Random rm1 = new Random(r2 * unchecked((int)DateTime.Now.Ticks) + i); ;
Response.Write(s[rm1.Next(0, s.Length)]);
}
泡泡鱼_ 2006-12-19
  • 打赏
  • 举报
回复
没有朋友帮忙看看吗??
自己顶下先

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧