C#随机数的无奈!

Jamestan 2008-08-28 01:45:45
namespace RandomTest
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
{
Random d = new Random();
Thread.Sleep(5);
Console.WriteLine(d.Next(100));
}
}
}
}

如果不加Thread.Sleep(5),产生的100个随机数除了第一个外,其他都是一样的!
...全文
7199 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangweissya 2011-05-04
  • 打赏
  • 举报
回复
真悲剧!
Random ran = new Random();
string b = "";
for (int i = 0; i < 100; i++)
{
b =b+ ran.Next(1, 255).ToString()+"*";

}
MessageBox.Show(b);

咋我这样写的没有出现重复!
.NET 2.0
竹子的信仰 2011-05-03
  • 打赏
  • 举报
回复
非常感谢4楼的提醒
竹子的信仰 2011-05-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 meng6758 的回复:]
Random是伪随机数,所以我觉得在很多场合不好用,与其费劲扒拉的修饰,不如直接调用VisualBasicfloat.VBMath.Rnd() 好
方法如下:
1 将VisualBasic.dll 置于bin目录
2 引用:using Microsoft.VisualBasic;
3 ok

//例:
//获取0-1000范围的随机数:
float rnd = Micr……
[/Quote]

不知这个可行不?
为啥被丢板砖了?
cgq815 2010-08-21
  • 打赏
  • 举报
回复
学习随机数的使用方法在编程中非常实用。
chance_wang 2009-08-04
  • 打赏
  • 举报
回复
MSDN中Random的代码示例,里面用的就是Thread.Sleep():
// Create a random object with a timer-generated seed.
static void AutoSeedRandoms( )
{
// Wait to allow the timer to advance.
Thread.Sleep( 1 );

Console.WriteLine(
"\nRandom numbers from a Random object " +
"with an auto-generated seed:" );
Random autoRand = new Random( );

RunIntNDoubleRandoms( autoRand );
}
cyj19821225 2009-07-17
  • 打赏
  • 举报
回复
今天要写一个随机数,也碰到了这个问题,这样写就可以解决了,或许还有更好的办法:
for (int i = 0; i < 100; i++)
{
Random d= new Random(unchecked((int)DateTime.Now.Ticks * i));
Console.WriteLine(d.Next(100));
}

注new Random()这里面的种子要保证每次循环都不一样就能产生不同的随机数了
根本不需要Thread.Sleep();
有需要的朋友可参考下
flymynew 2009-02-04
  • 打赏
  • 举报
回复
c#.net随机数不重复代码(20个,方法)
public ran(int min,int max,string []teststr)
{
string[] str = new string[20];
Random ran1 = new Random();
for (int i = 0; i < 20; i++)
{
str[i] = ran1.Next(min , max +1).ToString();
for (int j = 0; j < i; j++)
{
if (str[i] != str[j])
{
teststr[j] = str[j];
if (i == 19)
{
teststr[19] = str[19];
}
}
else
{
System.Threading.Thread.Sleep(15);
str[i] = ran1.Next(min , max +1).ToString();
}

}
}

mousebaby8080 2008-12-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yatobiaf 的回复:]
引用 8 楼 wolf_life 的回复:
for (int i = 0; i < 100; i++)
{
Random d = new Random();
Thread.Sleep(5);
Console.WriteLine(d.Next(100));
}
这样写的问题是:
Random是引用类型的,他的生成是在堆中,当第一次生成实例时,他就在堆中生成一个,但第二生成实例时(这个运行库做了优化,他会在堆中找有没有相同的,有的话就把指针指…
[/Quote]

这位仁兄分析的没什么道理,垃圾回收的原理不是这样的,否则内存分配还不乱套了。
.net是会废物利用未被回收的过期对象,但会执行这个对象的析构方法,并且调整对象的代数,如果不信,执行下面的程序试试看

class Program {
static void Main() {
List<Random> rList = new List<Random>(100);
for (int i = 0; i < 100; ++i) {
Random r = new Random();
Console.WriteLine(r.Next());
rList.Add(r);
}
}
}

用一个集合类,保证对象不会被回收,每次产生新对象。

之所以产生大量重复随机数,只是因为Random的默认构造器使用Environment.TickCount属性作为随机数种子,而Environment.TickCount值精度过低导致的。
MENG6758 2008-11-26
  • 打赏
  • 举报
回复
Random是伪随机数,所以我觉得在很多场合不好用,与其费劲扒拉的修饰,不如直接调用VisualBasicfloat.VBMath.Rnd() 好
方法如下:
1 将VisualBasic.dll 置于bin目录
2 引用:using Microsoft.VisualBasic;
3 ok

//例:
//获取0-1000范围的随机数:
float rnd = Microsoft.VisualBasic.VBMath.Rnd() * 1000;
yatobiaf 2008-08-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wolf_life 的回复:]
for (int i = 0; i < 100; i++)
{
Random d = new Random();
Thread.Sleep(5);
Console.WriteLine(d.Next(100));
}
这样写的问题是:
Random是引用类型的,他的生成是在堆中,当第一次生成实例时,他就在堆中生成一个,但第二生成实例时(这个运行库做了优化,他会在堆中找有没有相同的,有的话就把指针指向他)在堆中的对象靠GC回收,当…
[/Quote]

这位仁兄分析的有道理,是因为GC没有来得及回收造成的Random对象每次都一样的缘故。
wolf_life 2008-08-28
  • 打赏
  • 举报
回复
for (int i = 0; i < 100; i++)
{
Random d = new Random();
Thread.Sleep(5);
Console.WriteLine(d.Next(100));
}
这样写的问题是:
Random是引用类型的,他的生成是在堆中,当第一次生成实例时,他就在堆中生成一个,但第二生成实例时(这个运行库做了优化,他会在堆中找有没有相同的,有的话就把指针指向他)在堆中的对象靠GC回收,当GC回收第一次生成的对象时,就有了不同的随机数了。

如果不加Thread.Sleep(5),产生的100个随机数除了第一个外,其他都是一样的! 这些说是不准确的。并不是规律。
W422080367 2008-08-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wdgphc 的回复:]
namespace RandomTest
{
class Program
{
static void Main(string[] args)
{
Random d = new Random();
for (int i = 0; i < 100; i++)
{
//Thread.Sleep(5);
Console.WriteLine(d.Next(100));
}
}
}
}
[/Quote]
lude8880 2008-08-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yatobiaf 的回复:]
Random d = new Random();
你把这句话放到循环外面就不会了!
你这样写,每次都是Random的默认对象,生成的随机数当然一样啦。或者你拿当前的时间来做随机数种子也可以啊。
[/Quote]
牛!
yatobiaf 2008-08-28
  • 打赏
  • 举报
回复
Random d = new Random();
你把这句话放到循环外面就不会了!
你这样写,每次都是Random的默认对象,生成的随机数当然一样啦。或者你拿当前的时间来做随机数种子也可以啊。
zhengshaodong 2008-08-28
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.Text;

namespace tester
{
/// <summary>
/// 产生不重复随机数的应用
/// 郑少东 2008.08.24
/// 摘要 C#随机数的应用中 如果是需要在短时间内产生大量随机数 推荐使用Guid.NewGuid().GetHashCode()作为种子
/// </summary>
class Program
{
static void Main(string[] args)
{
Console.WriteLine(String.Format("开始时间{0}", DateTime.Now.ToString("yyyy-MM-dd hh:ss fff")));
List<int> Numbers = Program.GetRandom(1, 1000);
for (int i = 0; i < Numbers.Count;i++ )
{
//Console.WriteLine(Numbers[i]);
}
Console.WriteLine(String.Format("结束时间{0}", DateTime.Now.ToString("yyyy-MM-dd hh:ss fff")));
Console.ReadLine();
}

/// <summary>
/// 返回一组唯一不重复的随机数
/// </summary>
/// <param name="minValue">最小值</param>
/// <param name="maxValue">最大值</param>
/// <returns>返回一组唯一不重复的随机数</returns>
public static List<int> GetRandom(int minValue, int maxValue)
{
List<int> Numbers = new List<int>();
//使用Guid.NewGuid().GetHashCode()作为种子,可以确保Random在极短时间产生的随机数尽可能做到不重复
Random rand = new Random(Guid.NewGuid().GetHashCode());
int item;
for (int i = minValue; i <= maxValue; i++)
{
item = rand.Next(minValue, maxValue + 1);
while (Numbers.IndexOf(item) != -1)
{
item = rand.Next(minValue, maxValue + 1);
}
Numbers.Add(item);
}
return Numbers;
}
}
}

可以根据自己需要改 种子用Guid.NewGuid().GetHashCode()在短时间里不会出现大量重复
wdgphc 2008-08-28
  • 打赏
  • 举报
回复
namespace RandomTest
{
class Program
{
static void Main(string[] args)
{
Random d = new Random();
for (int i = 0; i < 100; i++)
{
//Thread.Sleep(5);
Console.WriteLine(d.Next(100));
}
}
}
}
Jamestan 2008-08-28
  • 打赏
  • 举报
回复
而且Sleep(15)毫秒的时候随机数才真正是随机的,5毫秒还会规律地出现2~3个同样的数!
Jamestan 2008-08-28
  • 打赏
  • 举报
回复
为什么想到要加Sleep,因为调试的时候加入中断点或者用MessageBox输出的时候随机数是正常的!就是只要程序有暂停的情况下随机数产生很正常!

110,535

社区成员

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

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

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