我正在使用C#中的.NET应用程序生成可变长度的随机数字字符串。我想添加一个清单,允许用户选择0到9之间的任何数字组合,并防止它们出现在字符串中。目前,我只是这样做以获取字符串:
do
{
int num = rnd.Next(10);
output += num.ToString();
i++;
}
while (i < stringLength);
我可以想出一种方法来排除选定的数字,一旦生成它们就把它们抛出而不是递增计数器,但似乎会有一个不那么浪费的算法。该程序将支持生成许多字符串,因此如果用户创建了数百万字符串,我希望将开销保持在最低限度。
奖金:我忘了提到我也想,如果有人能指出我这样的模式的资源。在不久的将来,我会根据参数随机编号,我会学习一些原则,而不是询问有关个别问题的问题。
答案 0 :(得分:15)
如果您生成一系列允许的字符,请从中选择:
int[] allowedDigits = {1, 2, 3, 6, 7, 0};
var output = new StringBuilder();
do
{
int num = rnd.Next(allowedDigits.Length);
output.Append(allowedDigits[num]);
i++;
}
while (i < stringLength);
显然生成了allowedDigits
而不是硬编码;)
使用StringBuilder
效率更高,您无需明确执行ToString
。
答案 1 :(得分:4)
答案 2 :(得分:0)
string[] num = new string[9];
int j = 0;
for(int k = 0; k < num.length; k++)
if (k != numToExclude)
num[j++] = k.ToString();
}
StringBuilder output = new StringBuilder(stringLength);
do
{
int n = rnd.Next(10);
output.Append(num[n]);
i++;
}
while (i < stringLength);
在上面的代码中,您可以更改num
数据类型char
。不确定是否可以优化任何内容。
答案 3 :(得分:0)
int [] excludeNum={2 , 3 , 4};
do
{
int num = rnd.Next(10);
if(excludeNum.Contains(num))
continue;
output += num.ToString();
i++;
}
while (i < stringLength);
使用continue
语句,您可以将控制流程更改回while();
而不会增加i
;
答案 4 :(得分:0)
只是为了笑,这是一种无偿的“聪明聪明”的做法:
int allowedDigits = {1, 3, 5, 4, 9};
//Generate an infinite sequence of numbers,
//so be careful not to do foreach over it!
IEnumerable<int> GenerateNumbers(int max)
{
while(true)
{
yield return rnd.Next(max);
}
}
var filteredNumbers = from num in GenerateNumbers(10)
where num in allowedDigits
select num;
output = String.Join("", fitleredNumbers.Take(stringLength));
(或者说是这样的话,没有编译器在mo ...中检查它)
不言而喻,这可能是无望的低效......