我正在创建一个宾果游戏,我正在使用Random
在int
数组中生成随机数,但我的问题是有时在索引中再次使用一个数字。如何使索引中的数字唯一?
这是我的工作:
namespace Bingo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Random randNum1 = new Random();
int[] random1 = new int[5];
int qwe = 0;
int i = 0;
private void button1_Click(object sender, EventArgs e)
{
Class1 class1 = new Class1();
class1.checker(this);
if (label1.Text == label2.Text || label3.Text == label4.Text) {
label2.Text = randNum1.Next(1, 15).ToString();
label4.Text = randNum1.Next(1, 15).ToString();
}
if (label5.Text == label1.Text || label5.Text == label2.Text) {
label5.Text = randNum1.Next(1, 15).ToString();
}
}
private void Form1_Load(object sender, EventArgs e)
{
Class1 class1 = new Class1();
class1.SetTwo(this);
for (int i = 0; i < random1.Length; i++)
{
random1[i] = randNum1.Next(1, 15);
label1.Text = random1[0].ToString();
label2.Text = random1[1].ToString();
label3.Text = random1[2].ToString();
label4.Text = random1[3].ToString();
label5.Text = random1[4].ToString();
}
}
}
答案 0 :(得分:7)
循环问题直到你发现一个未使用的循环问题是随着游戏的进行,你需要花费更长的时间才能找到一个有效的数字。从理论上讲,你的循环永远不会结束(极有可能,但仍然......)
最简单的事情是在真正的宾果游戏中发生的事情。从有限的集合开始,实际上每次绘制时都从集合中删除项目。使用初始可能性填充List或任何其他动态索引容器,随机选择从0到列表大小的索引,然后从列表中删除选择。
这将保证每个选择都会产生唯一的结果,而不会产生循环。
答案 1 :(得分:2)
我认为 Scott Mermelstein 的回答可能有所帮助:
List<int> AvailableNumbers;
Random random;
private void Form1_Load(object sender, EventArgs e)
{
//Create a list of numbers, 1-14
AvailableNumbers = Enumerable.Range(1, 14).ToList();
random = new Random();
label1.Text = GetNextNumber().ToString();
label2.Text = GetNextNumber().ToString();
label3.Text = GetNextNumber().ToString();
label4.Text = GetNextNumber().ToString();
label5.Text = GetNextNumber().ToString();
}
private int GetNextNumber()
{
//Get a random index within the bounds of AvailableNumbers
var nextIndex = random.Next(0, AvailableNumbers.Count);
var nextNumber = AvailableNumbers[nextIndex];
AvailableNumbers.RemoveAt(nextIndex);
return nextNumber;
}
答案 2 :(得分:1)
另一种方法是对已排序的数字列表进行洗牌:
var numbers = Enumerable.Range(1, 15).OrderBy(i => Guid.NewGuid()).ToArray();
这是如何运作的?
Enumerable.Range(1, 15) => [1, 2, 3, ..., 15]
)OrderBy
)Guid.NewGuid()
显然,只有当Guid.NewGuid()
不生成连续的GUID时,这才有效,但我认为默认不会,因为这是GUID算法的第一个实现的安全问题。
(我从这里得到了GUIDs提示: Randomize a List<T>)
您可以使用其他更有效的方法来改组“套牌”,但对于Bingo风格的应用程序,这应该可以正常工作。
另一个想法:
var rand = new Random();
var numbers = Enumerable.Range(1, 15).OrderBy(i => rand.Next()).ToArray();
由于起始列表中的元素是唯一的,因此保证结果能够重现该属性。
答案 3 :(得分:0)
每当你拿到一个新号码时,只需用它包围它:
int num;
do
{
num = randNum1.Next(1, 15);
}
while(random1.Contains(num))
random1[i] = num;
保证它是唯一的