随机数字字符串,不包括特定数字

时间:2011-03-10 14:24:34

标签: c# .net random

我正在使用C#中的.NET应用程序生成可变长度的随机数字字符串。我想添加一个清单,允许用户选择0到9之间的任何数字组合,并防止它们出现在字符串中。目前,我只是这样做以获取字符串:

do
{
   int num = rnd.Next(10);
   output += num.ToString();
   i++;
}
while (i < stringLength);

我可以想出一种方法来排除选定的数字,一旦生成它们就把它们抛出而不是递增计数器,但似乎会有一个不那么浪费的算法。该程序将支持生成许多字符串,因此如果用户创建了数百万字符串,我希望将开销保持在最低限度。

奖金:我忘了提到我也想,如果有人能指出我这样的模式的资源。在不久的将来,我会根据参数随机编号,我会学习一些原则,而不是询问有关个别问题的问题。

5 个答案:

答案 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)

  1. 创建一个长度为n的数组,持有 选择的数字。
  2. 生成0到0之间的随机数 n-1,包括
  3. 使用随机数作为数组 索引来选择数字。

答案 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 ...中检查它)

不言而喻,这可能是无望的低效......