【问题标题】:Random number generator - variable length随机数生成器 - 可变长度
【发布时间】:2012-01-26 23:22:30
【问题描述】:

目前我的程序生成由数字组成的随机 8 个字符串。

见下文

public static string GenerateNewCode()
    {
        string newCode = String.Empty;
        int seed = unchecked(DateTime.Now.Ticks.GetHashCode());
        Random random = new Random(seed);

        // keep going until we find a unique code       
        do
        {
            newCode = random.Next(0, 9999).ToString("0000")
                    + random.Next(0, 9999).ToString("0000");
        }
        while (!ConsumerCode.isUnique(newCode));

        // return
        return newCode;
    }

但是,我希望能够创建 8、9、10、11 和 12 个数字的随机代码。

不确定最有效的方法。

我的想法是创建一个介于 0 到 9 之间的随机数,然后根据所需的代码长度执行 X 次。

必须有一种简单/更有效的方法来做到这一点.....

【问题讨论】:

  • 您应该将 Random 实例缓存在某个字段中,并且只创建一次。在方法中创建和丢弃 Random 实例很少是正确的做法。而且您的种子实际上并不比 Random 内部使用的更好。

标签: c# random numbers


【解决方案1】:

除非这是时间紧迫的,否则我每次都会生成一个 12 位随机数,并且只使用我需要的 8-12 位。您正在测试并重试唯一性,因此应该仍然有效。

【讨论】:

  • 对你说实话非常关键。
【解决方案2】:
internal class Program {
    private static void Main(string[] args) {
        Console.WriteLine(GetNumber(7));
        Console.WriteLine(GetNumber(8));
        Console.WriteLine(GetNumber(12));
        Console.WriteLine(GetNumber(500));
    }

    public static string GetNumber(int length) {
        return string.Concat(RandomDigits().Take(length));
    }

    public static IEnumerable<int> RandomDigits() {
        var rng = new Random(System.Environment.TickCount);
        while (true) yield return rng.Next(10);
    }
}

internal class Program {
    private static void Main(string[] args) {
        Console.WriteLine(GetNumber(12));
    }

    public static string GetNumber(int length) {
        var rng = new Random(Environment.TickCount);
        return string.Concat(Enumerable.Range(0, length).Select((index) => rng.Next(10).ToString()));
    }
}

容易吗?是的。最有效率?也许不会。

【讨论】:

    【解决方案3】:
     var r = new Random();
     z = 12
     Enumerable.Range(1,z).Select(x => r.Next(10).ToString()).Aggregate((x,y) => x + y)
    

    也许效率不高,但看起来很酷:D

    【讨论】:

      【解决方案4】:

      如果您想预先定义代码的长度,请使用:

      public static string GenerateNewCode(int length)
          {
              string newCode = String.Empty;
              int seed = unchecked(DateTime.Now.Ticks.GetHashCode());
              Random random = new Random(seed);
      
              // keep going until we find a unique code       
              do
              {
                  newCode = random.Next(Math.Pow(10,length-1), Math.Pow(10,length)-1).ToString("0000")
              }
              while (!ConsumerCode.isUnique(newCode));
      
              // return
              return newCode;
          }
      

      如果您希望长度是随机的,请使用:

      public static string GenerateNewCode()
          {
              string newCode = String.Empty;
              int seed = unchecked(DateTime.Now.Ticks.GetHashCode());
              Random random = new Random(seed);
              int length = random.Next(9,12);
              // keep going until we find a unique code       
              do
              {
                  newCode = random.Next(Math.Pow(10,length-1), Math.Pow(10,length)-1).ToString("0000")
              }
              while (!ConsumerCode.isUnique(newCode));
      
              // return
              return newCode;
          }
      

      【讨论】:

      • 您好,我使用了您的第一个代码,但是当我传入长度为 10 的代码时,它会生成第一个长度为 10 的代码,但接下来的“X”次仅提供 9 个字符的代码。有什么想法吗?
      • 第一个 GenerateNewCode 方法有问题,当 codeLength 为 10 或更大时会出错,因为 10 的 9 次方大于 int32.MaxValue
      【解决方案5】:

      我会这样做:

      List<int> li = new List<int>();
      for(int i = 0; i<=9999; i++) 
      {
      li.Add(i);
      }
      List<int> liRandom = new List<int>();
      for(int i = 0; i<= 9999; i++) //replace 9999 with a number you need to gen
      {
      int randomIndex = rand.Next(0,li.Length);
      liRandom.Add(li[randomIndex]);
      li.Remove(li[randomIndex]);
      }// liRandom now contains needed numbers
      

      希望你明白了 :)

      【讨论】:

      • 嗨,Elastep,如果我的函数传入 GenerateNewCode(9) 会返回 9 个数字的代码吗?
      • 如果您将第二个 9999 替换为您需要的号码,它将返回所需数量的唯一号码
      【解决方案6】:

      而且这个可能实际上是有效的

          public static string GetNumber(int length) {
              var rng = new Random(Environment.TickCount);
              var number = rng.NextDouble().ToString("0.000000000000").Substring(2, length);
              return number;
          }
      

      最多可工作 12 个字符,最多可工作 16 个。

      【讨论】:

        猜你喜欢
        • 2022-11-17
        • 1970-01-01
        • 2012-05-16
        • 1970-01-01
        • 2016-12-21
        • 2018-01-25
        • 2020-03-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多