1、直接用.NET Framework 提供的 Guid() 函数,此种方法使用非常广泛。GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的任何两台计算机都不会生成重复的 GUID 值(即保证所有机器都是唯一的)。关于GUID的介绍在此不作具体熬述,想深入了解可以自行查阅MSDN。代码如下:
复制代码 代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string _guid = GetGuid();
Console.WriteLine(“唯一码:{0}\t长度为:{1}\n去掉连接符:{2}”, _guid, _guid.Length, _guid.Replace(“-“, “”));
string uniqueIdString = GuidTo16String();
Console.WriteLine("唯一码:{0}\t长度为:{1}", uniqueIdString, uniqueIdString.Length);
long uniqueIdLong = GuidToLongID();
Console.WriteLine("唯一码:{0}\t长度为:{1}", uniqueIdLong, uniqueIdLong.ToString().Length);
}
/// <summary>
/// 由连字符分隔的32位数字
/// </summary>
/// <returns></returns>
private static string GetGuid()
{
System.Guid guid = new Guid();
guid = Guid.NewGuid();
return guid.ToString();
}
/// <summary>
/// 根据GUID获取16位的唯一字符串
/// </summary>
/// <param name=\"guid\"></param>
/// <returns></returns>
public static string GuidTo16String()
{
long i = 1;
foreach (byte b in Guid.NewGuid().ToByteArray())
i *= ((int)b + 1);
return string.Format("{0:x}", i - DateTime.Now.Ticks);
}
/// <summary>
/// 根据GUID获取19位的唯一数字序列
/// </summary>
/// <returns></returns>
public static long GuidToLongID()
{
byte[] buffer = Guid.NewGuid().ToByteArray();
return BitConverter.ToInt64(buffer, 0);
}
}
}
Random快速连续产生相同随机数的解决方案:
第一种方式:使用DateTime.Now.Ticks生成随机数;
优缺点:如果触发Random函数间隔时间很短,就有可能造成产生一样的随机数
第二种方式: 使用Thread.Sleep(),在每次循环产生随机数前延迟几个毫秒,防止由于计算机运算速度过快,产生伪随机数;
优缺点:生成速度慢,不适合快速生成大量随机数
第三种方式:使用RNGCryptoServiceProvider生成Seed;加密随机数生成器生成Random的Seed种子
缺点:生成速度较慢,但是好于第二种;
优点:使用RNGCryptoServiceProvider还可以生成随机字符串;
第四种方式:使用Guid生成Seed;
优缺点:生成速度快,适合生成大量随机数;
using System;
using System.Diagnostics;
using System.Threading;
namespace CSharp生成随机数
{
class Program
{
///
/// 使用RNGCryptoServiceProvider生成种子
///
///
static int GetRandomSeed()
{
byte[] bytes = new byte[4];
System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
rng.GetBytes(bytes);
return BitConverter.ToInt32(bytes, 0);
}
/// <summary>
/// 使用Guid生成种子
/// </summary>
/// <returns></returns>
static int GetRandomSeedbyGuid()
{
return new Guid().GetHashCode();
}
/// <summary>
/// 使用Thread.Sleep()方式产生真随机数
/// </summary>
static void GetRandomBySleep(int[] array)
{
int len = array.Length;
Random random = new Random();
for (int i = 0; i < len; i++)
{
Thread.Sleep(1);
array[i] = random.Next(0, len);
}
//Print(array);// 输出生成的随机数
}
/// <summary>
/// 使用RNGCryptoServiceProvider产生的种子生成真随机数
/// </summary>
static void GetRandomByRNGCryptoServiceProvider(int[] array)
{
int len = array.Length;
Random random = new Random(GetRandomSeed());
for (int i = 0; i < len; i++)
{
array[i] = random.Next(0, len);
}
//Print(array);// 输出生成的随机数
}
/// <summary>
/// 使用Guid产生的种子生成真随机数
/// </summary>
static void GetRandomByGuid(int[] array)
{
int len = array.Length;
Random random = new Random(GetRandomSeedbyGuid());
for (int i = 0; i < len; i++)
{
array[i] = random.Next(0, len);
}
//Print(array);// 输出生成的随机数
}
static void Print(int[] array)
{
for (int i = 0; i < array.Length; i++)
Console.Write(string.Format("{0} ", array[i]));
Console.ReadLine();
}
static void Main(string[] args)
{
int[] array = new int[400];
Stopwatch sw = new Stopwatch();
sw.Start();
GetRandomBySleep(array);
sw.Stop();
TimeSpan ts = sw.Elapsed;
Console.WriteLine("使用Thread.Sleep(1)总共花费{0}ms.", ts.TotalMilliseconds);
sw.Reset();
sw.Start();
GetRandomByRNGCryptoServiceProvider(array);
sw.Stop();
ts = sw.Elapsed;
Console.WriteLine("使用RNGCryptoServiceProvider生成种子,产生随机数总共花费:{0}ms.", ts.TotalMilliseconds);
sw.Reset();
sw.Start();
GetRandomByGuid(array);
sw.Stop();
ts = sw.Elapsed;
Console.WriteLine("使用Guid生成种子,产生随机数总共花费:{0}ms.", ts.TotalMilliseconds);
Console.ReadLine();
}
}
}
可以看到同是产生400个随机数,第四种方式的效率比第三种提高了1数量级,比第二种提高了3个数量级。