C#随机数棘手问题

wfyfngu 2006-08-25 05:04:11
本来想随即生成一个25位长的随机数,但是C#就是不听使唤,请帮忙看看问题所在
代码
private string createSN()
{
string[] sn = new string[25];
string returnString = "YJ";
for(int i=2; i<25;i++)
{
sn[i] = this.getRabdom(0,9).ToString();
}
for(int i=2; i<25;i++)
{
returnString += sn[i];
}
return returnString;
}

private int getRabdom(int min, int max)
Random ran = new Random();
return ran.Next(min,max);
}

正常运行情况下发现后面23位数每次都相同
调试状态下,一切正常,都是生成各自的随机数
...全文
1769 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
bill024 2006-09-07
  • 打赏
  • 举报
回复
mark
freshlifeO 2006-09-01
  • 打赏
  • 举报
回复
以前遇到过,现在明白了。
ycy589 2006-08-31
  • 打赏
  • 举报
回复
好帖

我也遇到这个问题
amnoh 2006-08-31
  • 打赏
  • 举报
回复
两次生成Random对象咯...
第一次用默认构造生成,然后取几个随机数做种子,再构造一个Random...
应该没问题...
========================
要注意,两次生成的Random实例的话,如果时间间隔足够小,那么...他们产生的随机数是一样的,
你再分别以这两个相同的随机数为种子...出来的下一个随机数依然是相同的,重复N次也是一样的,
而且你没必要以产生的随机数为种子再构造Random,因为Random下次产生时本来就是以上次的随机数为种子的,自己构造的话,反倒多了一个环节,影响性能;
所以,关键是在几乎同时生成随机数的时候,最好的选择就是用一个Random依次生成所需的随机数
lunice 2006-08-30
  • 打赏
  • 举报
回复
收藏.
chaircat 2006-08-30
  • 打赏
  • 举报
回复
两次生成Random对象咯...
第一次用默认构造生成,然后取几个随机数做种子,再构造一个Random...
应该没问题...
破碎的脸 2006-08-30
  • 打赏
  • 举报
回复
C#好像已经默认了以时间为种子产生随机数吧,那么再用时间作种子有意义吗??如果随机数是连续产生的,那么如果CPU运行得太快,也有可能会产生出相同的。。。。。小菜鸟在想可不可以自己用随机数作为种子,来产生新的随机数??望各位高手指点。。。。
amnoh 2006-08-30
  • 打赏
  • 举报
回复
但我还是不明白,既然是以时间为种子,那么如果CPU的时间要是足够快的话,快到连滴答单位都没有办法区分,那么生成的随机数还是一样的吗?
===============================================
如果不指定参数,第一次创建Random时,以当时的时间为种子,以后会以上次产生的数字作为下一次的种子,这样,你创建一个实例的话,用它去生成随机数不会出错.
估计调试时比较慢,所以重复实例化Random时时间不同,而正常运行时速度很快,重复实例化时每次得到的时间相同,导致错误产生.
cooperator 2006-08-30
  • 打赏
  • 举报
回复
kissed() ( ) 信誉:100 Blog 2006-8-25 19:39:44 得分: 0
不用说我的是最好的

请问效率如何,您测试过吗?比如10万中取8万...


CmUpDate 2006-08-29
  • 打赏
  • 举报
回复
我们公司是这样做的

假设产生 10 位随机数字
1,随机生成 10 个长 1024 位的随机数字
2,随即产生 10 个小于 1024 的数字
3,用 “第二步” 的数字去 “第一步” 中找对应位置的数字

什么都不管,找就是了
kingtoo010 2006-08-27
  • 打赏
  • 举报
回复
帮顶..接分...
------------------------------------------------------------------------------------
100M.Net空间+50M企业邮局=60元/年
100M.Net空间+国际顶级域名=100元/年
国际顶级域名.com.net.cn=50元/年
本站申请域名可绑定免费10M Asp.Net空间
1000M.Net空间 + 100M MsSql数据库 + 1000M企业邮局 + 顶级域名=600元/年
数据库 企业邮局 网站推广 整机租用 美国空间 网站建设 均有售
还有很多优惠套餐提供给各个用户层.
有意者可联系电话:021-64802212 传真:021-64802212
咨询信箱:info@kingtoo.com 咨询OICQ:68311305,379620139 81778640
billmo1986 2006-08-27
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Security.Cryptography;

namespace randnumber
...{
class randnumber
...{
/**//// <summary>
/// 产生随机数的个数
/// </summary>
public int num;
/**//// <summary>
/// 随机数存储的数组
/// </summary>
public double[] randnum;

/**//// <summary>
/// 构造函数
/// </summary>
public randnumber(int num)
...{
this.num = num;
randnum = new double[this.num];
}


/**//// <summary>
/// 产生随机数,填充数组
/// </summary>
/// <returns>产生0--1之间的随机数,填充数组</returns>
private void RundoubleRandoms(Random randObj )
...{


for (int i=0; i < num; i++)
...{
randnum[i] = randObj.NextDouble();

}


}
/**//// <summary>
/// 利用系统时间产生随机数
/// </summary>
/// <remarks>调用RundoubleRandoms方法填充数组</remarks>
public void AutoSeedRandoms()
...{

Random autoRand = new Random();

RundoubleRandoms(autoRand);
}

/**//// <summary>
/// 产生一串随机的密码串
/// </summary>
public string GetRandomPassword(int length)
...{
byte[] random = new Byte[length / 2];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetNonZeroBytes(random);

StringBuilder sb = new StringBuilder(length);

for (int i = 0; i < random.Length; i++)
...{
sb.Append(String.Format("{0:X2}", random[i]));
}
return sb.ToString();
}

}
}





这其中包含一个用。net中的密码生成创建一个随机的密码串
ilove8 2006-08-27
  • 打赏
  • 举报
回复
学习
www_123du_com 2006-08-26
  • 打赏
  • 举报
回复
生成1000000位数的,只要1秒多
wfyfngu 2006-08-26
  • 打赏
  • 举报
回复
问题已经解决了,谢谢各位的帮助

但我还是不明白,既然是以时间为种子,那么如果CPU的时间要是足够快的话,快到连滴答单位都没有办法区分,那么生成的随机数还是一样的吗?

还有,Knight94(愚翁)等的方法,只实例化一个Random对象(把一个Random作为字段)也可以解决问题,难道这样代码的运行时间就更慢吗?
www_123du_com 2006-08-26
  • 打赏
  • 举报
回复
//给你一个刚写的函数,生成定长随机数字符串,测试过,速度还挺快
string GetRandomNumString(int length)
{
StringBuilder sbd = new StringBuilder();
if (length <= 0)
{
throw new ArgumentException("个数必须大于0","length");
}
byte[] buffer = new byte[length*4];
System.Security.Cryptography.RandomNumberGenerator.Create().GetBytes(buffer);
for (int i=0; i<length; i++)
{
sbd.Append(Math.Abs(BitConverter.ToInt32(buffer,i*4))%10);
}
return sbd.ToString();
}
tshark 2006-08-26
  • 打赏
  • 举报
回复
原来随即数在短时间内种子是一样的啊!!怪不得我在生成验证图片的时候上面的麻子点100个随即数只出来几个点呢.
jointan 2006-08-26
  • 打赏
  • 举报
回复
不如通过GUID来解决,GUID是四个整数,四个整数平铺开,长度至少要比25位长N多.
可以把GUID每四个字节分一组,组四个整数,
显后把四个整数格式化成四个7位的10进制数,然后,随机从中删掉3个数码.
ymxmy 2006-08-26
  • 打赏
  • 举报
回复
种子在很短时间内是一样得,结果当然就一样了。
stcllnb 2006-08-26
  • 打赏
  • 举报
回复
循环调用CodeBuild()方法,因为有延时1毫妙,所以不会产生重复的字符串
加载更多回复(22)

110,552

社区成员

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

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

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