【问题标题】:Random Number but Don't Repeat随机数但不重复
【发布时间】:2010-11-16 03:09:58
【问题描述】:

我想生成一个小于 50 的随机数,但是一旦生成了该数字,我希望它不会再次生成。

感谢您的帮助!

【问题讨论】:

  • 你只能这样做 50 次 :-)
  • 严格来说,这不是一个随机数。相反,它是 1-49(或 0-49)范围内数字的随机排列。

标签: vb.net shuffle


【解决方案1】:

以下代码生成长度为您作为参数传递的字母数字字符串。

Public Shared Function GetRandomAlphaNumericString(ByVal intStringLength As Integer) As String

Dim chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"

Dim intLength As Integer = intStringLength - 1

Dim stringChars = New Char(intLength) {}

Dim random = New Random()

    For i As Integer = 0 To stringChars.Length - 1
        stringChars(i) = chars(random.[Next](chars.Length))
    Next

    Dim finalString = New [String](stringChars)
    Return finalString
End Function

【讨论】:

    【解决方案2】:

    看到问题被标记为 VB/VB.Net...这是 Mitch 答案的 VB 实现。

    Public Class Utils
    
       Public Shared Sub ShuffleArray(ByVal items() As Integer)
    
          Dim ptr As Integer
          Dim alt As Integer
          Dim tmp As Integer
          Dim rnd As New Random()
    
          ptr = items.Length
    
          Do While ptr > 1
             ptr -= 1
             alt = rnd.Next(ptr - 1)
             tmp = items(alt)
             items(alt) = items(ptr)
             items(ptr) = tmp
          Loop
    
       End Sub
    
    End Class
    

    【讨论】:

      【解决方案3】:

      请看:Fisher–Yates shuffle:

      public static void shuffle (int[] array) 
      {
          Random rng = new Random();       // i.e., java.util.Random.
          int n = array.length;            // The number of items left to shuffle (loop invariant).
          while (n > 1) 
          {
              n--;                         // n is now the last pertinent index
              int k = rng.nextInt(n + 1);  // 0 <= k <= n.
              int tmp = array[k];
              array[k] = array[n];
              array[n] = tmp;
          }
      }
      

      【讨论】:

      • 谢谢,过去 15 分钟我一直在玩它,但似乎不知道如何调用它。我对 vb 有点陌生。
      • 应该 rng.nextInt(n + 1) 实际上是 rng.nextInt(n-1) 吗?
      • @StevenT:不,不在 C# 中
      【解决方案4】:

      将数字 1-49 放入一个可排序的集合中,然后按随机顺序排序;根据需要从集合中弹出每一个。

      【讨论】:

      • 呃。 “按随机顺序排序”是一个矛盾的术语。
      • 没错,我的错 :-)。随机重新订购?
      • 您要查找的词是:“将数字 1 到 50 放在一个集合中,随机播放,然后一个一个地弹出一个。”
      • 宾果游戏。 (双关语。)+1 为 Mitch 提供真正的答案
      猜你喜欢
      • 1970-01-01
      • 2021-03-22
      • 2020-05-18
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      相关资源
      最近更新 更多