C# 生成不重复随机字符串 (1秒内生成1000000个) PHP

摘要:
paramname=“count”>字符串>len));}intstep=(int)stepLong;如果(step<returnnull;list=newList<step)+begin;值));对于(inti=0;i<charList.Count);stringtemp=charList[i];}returncharList;

生成不重复随机字符串

生成1000000个用时不到1秒。

如果要生成6位随机的不重复字符串,一般的想法是,使用Random生一个字符串,记录到数组中,再生成一个如果不在数组中则插入。直到生够数量。

但这样效率会很低。对于6位随机字符,数字+字母=36个字符。6位转化为数字最大数为 36的6次方 = 2176782336。

只要生成小于最大数的随机数,再转化为字符串即可。

我的做法是,用最大数除以要生成的个数。得到一个递增值X。

第一个随机数在0-X之间。第二个在X-X*2之间。之后以此类推,这样将避免了可能生成的随机数重复。

然后再将随机数转化为指定长度的字符串。

但这样生成的字符串数组会是顺序的。所以再打乱数组顺序输出。

获取随机不重复字符串核心代码

/// <summary>
/// 获取随机字符串
/// </summary>
/// <param name="len"></param>
/// <param name="count"></param>
/// <returns></returns>
private List<string> GetRandString(int len, int count)
{
	double max_value = Math.Pow(36, len);
	if (max_value > long.MaxValue)
	{
		ShowError(string.Format("Math.Pow(36, {0}) 超出 long最大值!", len));
		return null;
	}
			
	long all_count = (long)max_value;
	long stepLong = all_count / count;
	if (stepLong > int.MaxValue)
	{
		ShowError(string.Format("stepLong ({0}) 超出 int最大值!", stepLong));
		return null;
	}
	int step = (int)stepLong;
	if (step < 3)
	{
		ShowError("step 不能小于 3!");
		return null;
	}
	long begin = 0;
	List<string> list = new List<string>();
	Random rand = new Random();
	while (true)
	{
		long value = rand.Next(1, step) + begin;
		begin += step;
		list.Add(GetChart(len, value));
		if (list.Count == count)
		{
			break;
		}
	}

	list = SortByRandom(list);

	return list;
}

将数字转化为字符串

//数字+字母
private const string CHAR = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

/// <summary>
/// 将数字转化成字符串
/// </summary>
/// <param name="len"></param>
/// <param name="value"></param>
/// <returns></returns>
private string GetChart(int len, long value)
{
	StringBuilder str = new StringBuilder();
	while (true)
	{
		str.Append(CHAR[(int)(value % 36)]);
		value = value / 36;
		if (str.Length == len)
		{
			break;
		}
	}

	return str.ToString();
}

打乱数组顺序

/// <summary>
/// 随机排序
/// </summary>
/// <param name="charList"></param>
/// <returns></returns>
private List<string> SortByRandom(List<string> charList)
{
	Random rand = new Random();
	for (int i = 0; i < charList.Count; i++)
	{
		int index = rand.Next(0, charList.Count);
		string temp = charList[i];
		charList[i] = charList[index];
		charList[index] = temp;
	}

	return charList;
}

  

源码下载:https://files.cnblogs.com/zjfree/randString.rar

开发环境:WIN7 + VS2010 + .NET2.0 + C#

免责声明:文章转载自《C# 生成不重复随机字符串 (1秒内生成1000000个) PHP》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Go使用变量类型声明和方法的注意事项docker安装启动es下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

idea修改maven默认配置不生效

1.问题现象 我的idea版本是2019.2的,通过File->Other Setting->Setting for New Projects修改maven的默认配置后,新建项目maven默认配置不生效 2.解决 打开C:Users用户.IntelliJIdea2019.2configoptions下的project.default.xml,添...

OC 字符和日期的互转

需要用到NSDateFormatter这个类。 1、字符串转换为日期 [plain]NSDateFormatter* dateFormat = [[NSDateFormatter alloc] init];//实例化一个NSDateFormatter对象 [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];/...

ElementUI的el-select怎样实现下拉多选并实现给下拉框赋值和获取值

场景 要实现的效果如下 官方示例代码实现多选 为el-select设置multiple属性即可启用多选,此时v-model的值为当前选中值所组成的数组。 默认情况下选中值会以 Tag 的形式展现,你也可以设置collapse-tags属性将它们合并为一段文字。 <template> <el-select v-model="valu...

atoi、stoi、strtoi区别

首先atoi和strtol都是c里面的函数,他们都可以将字符串转为int,它们的参数都是const char*,因此在用string时,必须调c_str()方法将其转为char*的字符串。或者atof,strtod将字符串转为double,它们都从字符串开始寻找数字或者正负号或者小数点,然后遇到非法字符终止,不会报异常: int main() {...

为什么C++,中字符串不能修改

因为在c++中,字符串为常量,所以不能修改,在python中字符串也是不可以修改的。  可以修改字符串 char* name ="sdfsfs"  这样的不能修改,因为这是一个指针 char name[] = "sdfsf" 这样的可以修改,因为这是一个数组 #include <stdio.h> int main() { char...

字符串截取及切割,正则表达式,expect预期交互

                                        字符串截取及切割,正则表达式,expect预期交互 案例1:字符串截取及切割 案例2:字符串初值的处理 案例3:expect预期交互 案例4:使用正则表达式 1案例1:字符串截取及切割 1.1问题 使用Shell完成各种Linux运维任务时,一旦涉及到判断、条件测试等相关操作时...