to 为什么一定要Thread.Sleep(时间)之后,才可以正常取得随机字符?否则得到的结果永远是同一个字符?你的代码如何写得。
生成一个随机数之前别忘了: Randomize; 使用前请用Randomize过程初始化
for (int i = 0; i < intUserCount; i++) { Random rnd = new Random(); int l=rnd.Next(0,arrUser.Length); string s = arrUser[l].ToString(); //如果这里加上Thread.Sleep(x)就可以正常得到。 strAllUser+=s; }
Sample code as follows: Random rnd = new Random(arrUser.Length);for (int i = 0; i < intUserCount; i++) { int l=rnd.Next(); string s = arrUser[l].ToString(); strAllUser+=s; }
//生成n位不同的验证码 //生成随机数函数中从strchar 数组中随机抽取 //字母区分大小写 //参数n为生成随机数的位数,一般取四位 public static string RandomNum(int n) // { string strchar = "0,1,2,3,4,5,6,7,8,9" ; string[] VcArray = strchar.Split(',') ; string VNum = "" ;//由于字符串很短,就不用StringBuilder了 int temp = -1 ; //记录上次随机数值,尽量避免产生几个一样的随机数 //采用一个简单的算法以保证生成随机数的不同 Random rand =new Random(); for ( int i = 1 ; i < n+1 ; i++ ) { if ( temp != -1) { rand =new Random(i*temp*unchecked((int)DateTime.Now.Ticks)); } //int t = rand.Next(35) ; int t=rand.Next(10); if (temp != -1 && temp == t) { return RandomNum( n); //这里好像是递归 } temp = t ; VNum += VcArray[t]; } return VNum ;//返回生成的随机数 } //生成随机数后,将值赋值给一个Label控件,然后改一下Label背景的颜色,OK了 // 谢谢阅读!
public static string RandomNum(int n) // { string strchar = "0,1,2,3,4,5,6,7,8,9" ; string[] VcArray = strchar.Split(',') ; string VNum = "" ;//由于字符串很短,就不用StringBuilder了 int temp = -1 ; //记录上次随机数值,尽量避免产生几个一样的随机数 //采用一个简单的算法以保证生成随机数的不同 Random rand =new Random(DataTime.Now.Ticks);//Create random object using current ticks for ( int i = 0 ; i < n ; i++ ) { VNum += VcArray[rand.Next()%10]; } return VNum ;//返回生成的随机数 }
Random rnd = new Random(1); for (int i = 0; i < 10; i++) { int l=rnd.Next(); // str1=str1.PadLeft(10,'1'); //无第二参数为加空格 Console.WriteLine(l.ToString().PadRight(10,'0'));
}写了个简单的感觉也比较的随机了
Knight94(愚翁) ( ) 信誉:110 大哥还是一样的问题,循环调用就会有好多数据是重复的
to Knight94(愚翁)你的代码会索引超出范围
to 你的代码会索引超出范围sorry! 我的问题,把数组长度也能产生随机数了,修改如下即可。 Random rnd = new Random(arrUser.Length);for (int i = 0; i < intUserCount; i++) { int l=rnd.Next(); string s = arrUser[l%arrUser.Length].ToString(); strAllUser+=s; }
为什么要用l%arrUser.Length呢?如果使用 Random rnd=new Random(0,arrUser.Length); 这样不是已经指定了新随机数产生的范围吗?
to 为什么要用l%arrUser.Length呢?因为指定随机数的范围是0-arrUser.Length,那么会产生的随机数可能等于arrUser.Length,那么用它去作索引,会越界。
to Random rnd=new Random(0,arrUser.Length); 这样不是已经指定了新随机数产生的范围吗?你所问的,脑袋已经说得很清楚,而我的做法也是这个意思。
Random rand =new Random(DataTime.Now.Ticks);//Create random object using current ticks 一次取多个随机数,这种做法是很有问题的, .net中,一个种子,只生成一个随机数列。 当cpu高速运转时,在一个DataTime.Now.Ticks内,可以取多个随机数,这时DataTime.Now.Ticks可能还没有变,生成的随机数当然一样了。一次取多个时,让种子不一样就可以了,再加个判断。 就比如说弄个static int,让它++做种子,就可以了。
使用前请用Randomize过程初始化
{
Random rnd = new Random();
int l=rnd.Next(0,arrUser.Length);
string s = arrUser[l].ToString();
//如果这里加上Thread.Sleep(x)就可以正常得到。
strAllUser+=s;
}
Random rnd = new Random(arrUser.Length);for (int i = 0; i < intUserCount; i++)
{
int l=rnd.Next();
string s = arrUser[l].ToString();
strAllUser+=s;
}
//生成n位不同的验证码
//生成随机数函数中从strchar 数组中随机抽取
//字母区分大小写
//参数n为生成随机数的位数,一般取四位
public static string RandomNum(int n) //
{
string strchar = "0,1,2,3,4,5,6,7,8,9" ;
string[] VcArray = strchar.Split(',') ;
string VNum = "" ;//由于字符串很短,就不用StringBuilder了
int temp = -1 ; //记录上次随机数值,尽量避免产生几个一样的随机数
//采用一个简单的算法以保证生成随机数的不同
Random rand =new Random();
for ( int i = 1 ; i < n+1 ; i++ )
{
if ( temp != -1)
{
rand =new Random(i*temp*unchecked((int)DateTime.Now.Ticks));
}
//int t = rand.Next(35) ;
int t=rand.Next(10);
if (temp != -1 && temp == t)
{
return RandomNum( n); //这里好像是递归
}
temp = t ;
VNum += VcArray[t];
}
return VNum ;//返回生成的随机数
}
//生成随机数后,将值赋值给一个Label控件,然后改一下Label背景的颜色,OK了
// 谢谢阅读!
static void Main(string[] args)
{
for(int i=0;i<=100;i++)
{
Console.WriteLine(RandomNum(10));
Thread.Sleep(10);
}
}好像是有这个问题,去掉Thread.Sleep(10);会有很多重复的难怪我以前点卡生成的时候就有很多密码是重复的,唉,原来是这里出问题了高人怎么解决,帮我改改吧!
{
string strchar = "0,1,2,3,4,5,6,7,8,9" ;
string[] VcArray = strchar.Split(',') ;
string VNum = "" ;//由于字符串很短,就不用StringBuilder了
int temp = -1 ; //记录上次随机数值,尽量避免产生几个一样的随机数
//采用一个简单的算法以保证生成随机数的不同
Random rand =new Random(DataTime.Now.Ticks);//Create random object using current ticks
for ( int i = 0 ; i < n ; i++ )
{
VNum += VcArray[rand.Next()%10];
}
return VNum ;//返回生成的随机数
}
for (int i = 0; i < 10; i++)
{
int l=rnd.Next();
// str1=str1.PadLeft(10,'1'); //无第二参数为加空格
Console.WriteLine(l.ToString().PadRight(10,'0'));
}写了个简单的感觉也比较的随机了
我的问题,把数组长度也能产生随机数了,修改如下即可。
Random rnd = new Random(arrUser.Length);for (int i = 0; i < intUserCount; i++)
{
int l=rnd.Next();
string s = arrUser[l%arrUser.Length].ToString();
strAllUser+=s;
}
Random rnd=new Random(0,arrUser.Length);
这样不是已经指定了新随机数产生的范围吗?
这样不是已经指定了新随机数产生的范围吗?你所问的,脑袋已经说得很清楚,而我的做法也是这个意思。
一次取多个随机数,这种做法是很有问题的,
.net中,一个种子,只生成一个随机数列。
当cpu高速运转时,在一个DataTime.Now.Ticks内,可以取多个随机数,这时DataTime.Now.Ticks可能还没有变,生成的随机数当然一样了。一次取多个时,让种子不一样就可以了,再加个判断。
就比如说弄个static int,让它++做种子,就可以了。