随机整数,不重复,在特定范围内

时间:2018-01-13 04:06:01

标签: c# string random generator

详细方案:

有300种可能符合描述的数字。

即,该数字必须介于1123和5543之间

该号码是唯一的,不会重复

该数字只有整数1,2,3,4和5。

我想要实现的是一个可以按升序一次显示所有这些数字的程序。

我目前的代码:

var chars = "12345";
var stringChars = new char[4];
var random = new Random();
for (int i = 0; i < stringChars.Length; i++)
{
stringChars[i] = chars[random.Next(chars.Length)];
}
var finalString = new String(stringChars);
Console.WriteLine(finalString)

此代码工作正常,但我还有2个额外要求。

  1. 循环300次
  2. 按升序显示所有结果
  3. 修改

    抱歉所有的困惑。这段代码产生的是一个4位数字,就像我想要的那样。但我想这样做300次。我想我可以使用Loop,但这是我第一次使用C#(过去我只使用过vb.net)。我的意思是随机和升序是:产生一个随机数,当生成所有数字时,在显示它们之前按升序排序。

    然而,如果订购它们会太复杂,那么没有它我就没事了。

1 个答案:

答案 0 :(得分:2)

您所询问的内容并不完全清楚,但这里有一些代码会打印出611(而不是300)数字,这些数字与您按升序排列的描述相符。

如果我正确理解了您的问题,您将需要从这个较大的集合中抽取300个不同的元素,对它们进行排序,然后将它们打印出来。您可以考虑使用Fisher-Yates shuffle来执行此操作。将列表洗牌,取出前300个,然后对它们进行排序。

public static void Main (string[] args) {
  var digits = new [] { 1, 1, 2, 3 };
  for (var num = DigitsToInt(digits); num <= 5543; num = DigitsToInt(digits)) {
    Console.WriteLine(num);

    for (int i = 3; i >= 0; i--) {
      digits[i]++;
      if (digits[i] < 6) {
        break;
      } else {
        digits[i] = 1;
      }
    }
  }
}

private static int DigitsToInt(int[] digits) {
  return 1000 * digits[0] + 100 * digits[1] + 10 * digits[2] + digits[3];
}