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个随机数除了第一个外,其他都是一样的!
{
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个随机数除了第一个外,其他都是一样的!
{
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));
}
}
}
}
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()在短时间里不会出现大量重复
你把这句话放到循环外面就不会了!
你这样写,每次都是Random的默认对象,生成的随机数当然一样啦。或者你拿当前的时间来做随机数种子也可以啊。
{
Random d = new Random();
Thread.Sleep(5);
Console.WriteLine(d.Next(100));
}
这样写的问题是:
Random是引用类型的,他的生成是在堆中,当第一次生成实例时,他就在堆中生成一个,但第二生成实例时(这个运行库做了优化,他会在堆中找有没有相同的,有的话就把指针指向他)在堆中的对象靠GC回收,当GC回收第一次生成的对象时,就有了不同的随机数了。如果不加Thread.Sleep(5),产生的100个随机数除了第一个外,其他都是一样的! 这些说是不准确的。并不是规律。
这位仁兄分析的有道理,是因为GC没有来得及回收造成的Random对象每次都一样的缘故。
方法如下:
1 将VisualBasic.dll 置于bin目录
2 引用:using Microsoft.VisualBasic;
3 ok //例:
//获取0-1000范围的随机数:
float rnd = Microsoft.VisualBasic.VBMath.Rnd() * 1000;
这位仁兄分析的没什么道理,垃圾回收的原理不是这样的,否则内存分配还不乱套了。
.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值精度过低导致的。
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();
} }
}
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();
有需要的朋友可参考下
// 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 );
}
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