【问题标题】:How to create a non-repeating random number?如何创建不重复的随机数?
【发布时间】:2014-11-16 16:48:04
【问题描述】:

我正在尝试为老人之家创建宾果游戏。我能够使用用于扫描数组的随机数生成器来制作一个,但问题是搜索数组需要很长时间(2 分钟)并确保没有重复双精度数。我做了一些研究,发现在 c 中称为伪随机的东西在创建时不会重复数字。但是代码看起来很复杂,所以我不愿意接受一些我不完全理解的东西。这带来了我的问题,有没有一种简单的方法来创建非重复随机数生成器或可以解释一个很好的解释?

【问题讨论】:

  • 你到底生成了多少个数字?即使您使用“扫描数组以查找重复项”方法,也不会花费那么长时间。

标签: c random


【解决方案1】:

很久以前,我用 C 编程语言编写了一个非常简单的程序,它生成 10 个 0 到 20 之间的随机数,不重复任何数字。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 10      //Number to be generated.
#define rangeMAX 20 //Upper limit of range.
#define rangeMIN 0  //Lower limit of range.

int main()
{
  int get, c, i, arr[MAX], chk, x;
  c = i = 0;
  srand(time(0)); // this will ensure that every time, program will generate different set of numbers. If you remove this, same set of numbers will generated every time you run the program.
  while(c < MAX)
  {
    get = ((rand() % (rangeMAX-rangeMIN+1)) + rangeMIN); // generate random number.
    //After generating that number check if it is already in array.
    for(i=0; i<=c; i++)
    {
        if(arr[i] == get)
        {
            chk = 0;
            break;
        }
        else if(arr[i] != get)
        {
            chk = 1;
        }
    }
    if(chk==1)
    {
        arr[c]=get;
        printf("%d\n",arr[c]);
        c++;
    }
  }
  return 0;
}

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    用适当的数字填写你的数组,然后随机播放。

    【讨论】:

    【解决方案3】:

    创建一个包含 N 个元素的数组,其中每个元素的值与其索引相同,如下所示: arr[0] = 0, arr[1] = 1, ...

    数组中的值可以是你喜欢的任何值(当然不会重复)。

    然后只需通过循环遍历数组并将当前元素与随机位置的一个交换来对数组进行洗牌。

    现在您的数组已被打乱,您只需维护一个从零开始的索引,该索引保存当前随机数的索引。当你想要一个新的随机数时,在当前索引处查找数组值,然后增加当前索引。

    如果您的索引到达数组的末尾,您可以重新排列数组并将当前索引设置回零。

    【讨论】:

    • 哇。谢谢你。非常详细。不太明白随机位置就不重复了。再一次,这是什么洗牌。再次感谢您的帮助。
    • "shuffle" 是在你发牌之前随机化一副​​牌的方法。在这里,您对首先排序但您想要“取消排序”的唯一值列表执行相同操作。
    【解决方案4】:

    有两种方法可以确保随机抽取的数字不重复:

    • 记住哪些号码已经看过,这样可以拒绝重复的号码
    • 从不重复的序列中提取数字

    哪种方法更适合视情况而定;两者都可以简单实施且速度非常快,但都不是普遍适用或普遍“更好”。

    第二种方法——使用无重复序列——是两者中较简单的一种;在极端情况下,它可以用一两行代码来实现。最近刚刚在主题中的代码审查中讨论过它

    关于重复搜索的速度:如果您认为这是您喜欢的方法,我确信我们可以将它加快几个数量级。

    【讨论】:

      【解决方案5】:

      Bingo Game VB(添加 2 个名为 btnNumber 和 BtnShuffle 的按钮,在表单设计中添加文本框) (将 100 更改为 75 或任何数字)

      公开课表1 Dim randomarray(100) As Integer 暗淡索引为整数 = 1 将计数器调暗为整数 将 btnNumber 调暗为 System.Windows.Forms.Button Private Sub Btnshuffle_Click(sender As Object, e As EventArgs) 处理 Btnshuffle.Click 对于 i = 1 到 100 随机数组(i) = i

          Next
          Randomize()
          Dim j As Integer
          Dim tmp As Integer
      
          For i = 1 To 100 - 1
              j = Int((100 - i + 1) * Rnd() + i)
              tmp = randomarray(i)
              randomarray(i) = randomarray(j)
              randomarray(j) = tmp
      
          Next
          BtnNextNumber.Enabled = True
          Index = 1
          TextBox1.Clear()
      End Sub
      
      Private Sub BtnNextNumber_Click(sender As Object, e As EventArgs) Handles BtnNextNumber.Click
      
          TextBox1.Text = randomarray(Index)
          Index = Index + 1
          If Index = randomarray.Count Then
              BtnNextNumber.Enabled = False
      
          End If
          Me.Controls("btnnumber" & TextBox1.Text).BackColor = Color.Yellow
      
      
      End Sub
      
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
          For Me.Counter = 1 To 100
              btnNumber = New System.Windows.Forms.Button
              btnNumber.Name = "btnNumber" & Counter
              btnNumber.Text = Counter
              btnNumber.Font = New System.Drawing.Font("Arial", 10.0!, System.Drawing.FontStyle.Bold)
              btnNumber.BackColor = Color.White
              'btnNumber.ForeColor.White
              btnNumber.TextAlign = HorizontalAlignment.Center
              btnNumber.Left = 40 + ((Counter - 1) Mod 10) * 60
              btnNumber.Top = 50 + ((Counter - 1) \ 10) * 40
              btnNumber.Width = 60
              btnNumber.Height = 40
              btnNumber.Enabled = False
      
              Me.Controls.Add(btnNumber)
          Next
      
      End Sub
      

      结束类

      【讨论】:

      • “(将 100 更改为 75 或任何数字)”与问题的任何部分有何关联? “Button1.Enabled = True Index = 1 TextBox1.Clear()”真的有必要吗?
      • 这个三年前的问题缺少C 标签,但从问题的标题中可以明显看出。您的回答也没有解释为什么这是一个好方法。这似乎是费雪-耶茨洗牌?
      猜你喜欢
      • 2014-05-09
      • 2012-04-03
      • 2013-10-28
      • 2012-03-14
      • 1970-01-01
      • 2017-08-01
      • 1970-01-01
      • 2023-03-06
      相关资源
      最近更新 更多