【问题标题】:Generate random numbers from 1 to 6 and stop at the last one生成从 1 到 6 的随机数并停在最后一个
【发布时间】:2014-05-08 06:49:57
【问题描述】:

我有以下代码:

int GetRandNumber()
{
    Random r = new Random();
    return r.Next() % 6 + 1;             
}

我正在开发一个 Windows 商店应用程序。我有一个文本框,其中生成了一个从 1 到 6 的数字。对于每个数字,我都做了一个特定的事件。我需要确保每个数字只生成一次,这样事件就不会重复。

【问题讨论】:

  • 在这种情况下有点挑剔,但在某些情况下,像这样使用模数 (%) 不会让你得到公平的分配。例如。见stackoverflow.com/questions/10984974/…;使用 Next 的不同重载应该会在您需要的范围内为您提供一个不错的、公平的数字。

标签: c# random numbers


【解决方案1】:

看起来您只需要随机排列数字。我建议创建一个从 1 到 6 的数字数组,然后对数组进行洗牌。您可以查看一些代码here,了解如何对数组/列表进行洗牌。

【讨论】:

  • 很抱歉打扰您了,我还没有成功。看看我对这个问题所做的更改。现在更清楚了。
  • 基本上你需要 1 到 6 但随机绑定到某个事件。我的建议是将 1 到 6 保留在一个数组中,对数组进行洗牌,这样当你阅读时,它是随机的,然后读取数组并绑定你的事件。你不会有重复的事件,数组的改组应该给你随机的数字。
【解决方案2】:

首先你需要小心这个实现,如果你多次调用GetRandomNumber() 非常接近它会给你同样的结果。更好的功能是

int GetRandNumber(Random r)
{
    return r.Next(1, 7); //This does the same as "r.Next() % 6 + 1" but removes bias.
}

//used like
Random rand = new Random();
foreach(var foo in bar)
{
    //The same instance of rand is used for each call instead of a new one each time.
    foo.SomeProp = GetRandNumber(rand);
 }

但是,这与您需要做的事情完全不同,您不应该在 1 到 6 之间生成随机数。您需要做的是列出 1 到 6 的列表,然后将列表打乱,而不是在all(你可能会在 shuffle 期间使用它们,但这是一个实现细节)

List<int> numbers = new List<int>();
for(int i = 1; i <= 6; i++)
{
    numbers.Add(i);
}

MyShuffleListFunction(numbers);

本站有plenty of examples介绍如何制作随机播放功能。

【讨论】:

  • 很抱歉打扰您了,我还没有成功。看看我对这个问题所做的更改。现在更清楚了。
  • @user3473574 你已经彻底改变了问题,我会回滚更改并提出一个新问题。
【解决方案3】:

也许我错了,但据我了解,您想要这样的输出:

344213266125

要实现这一点,您应该跟踪已经生成了哪些数字,并在所有数字都至少“滚动”一次时停止。 因此,让我们将一个 bool 数组初始化为 6 个 false 值,并在每次随机数生成后(每次滚动后)将数组的对应元素设置为 true。检查数组中是否有任何错误值,如果没有则“再次滚动”。

此外,您可以考虑根据其他答案生成数字,因为它们当然是正确的:这不是理想的方式。

更新

好的,根据您的问题更新,我还更新了我的伪代码(或者我应该称之为散文): 跟踪已经“滚动”的数字(如上)。生成新号码时,检查它是否已经生成。如果之前已滚动,则再次滚动,直到滚动新的:然后相应地更新数组。另外一定要检查是否有一个有效的数字或在开始滚动之前都已经滚动...

但现在在我看来,您真正要寻找的只是一个随机播放,这已在其他答案中提出。

【讨论】:

  • 很抱歉打扰您,我还没有成功。看看我对这个问题所做的更改。现在更清楚了。
  • 在这种情况下-根据我在答案中给出的建议-您应该在每次“滚动”后更新数组:查看您滚动的数字是否已经滚动一次,如果是,则滚动再次,如果没有,则在数组中设置标志并返回该数字。
  • 这样吗? if (generated.Text.Contains(GetRandNumber().ToString())) { numbers.Visibility = Windows.UI.Xaml.Visibility.Collapsed; } numbers.Text=GetRandNumber().ToString();
  • 不,这似乎不对。但是您应该将现有代码添加到问题中 - 或者创建一个新代码,因为问题似乎与原始问题不同。
  • int GetRandNumber() { Random r = new Random(); return r.Next(1,7); } private void Button_Click_1(object sender, RoutedEventArgs e) { if (generated.Text.Contains(GetRandNumber().ToString())) { numbers.Visibility = Windows.UI.Xaml.Visibility.Collapsed; } numbers.Text=GetRandNumber().ToString(); } private void numbers_TextChanged(object sender, TextChangedEventArgs e) { generated.Text = numbers.Text + generated.Text; }
【解决方案4】:

也许这对你有用。方法是将随机结果记录在 List 中,如果结果已经存在于 List 中,则跳过输出。

class Program
{
    static int tmp;

    static void Main(string[] args)
    {
        List<int> alreadyFired = new List<int>();                   

        while (alreadyFired.Count != 6)
        {

            Random rng = new Random();

            int diceresult = rng.Next(1,7);

            foreach (var item in alreadyFired)
            {
                if (item == diceresult)
                {
                    tmp = item;
                }
            }

            if (!(tmp == diceresult))
            {
                alreadyFired.Add(diceresult);                 
                Console.WriteLine(diceresult);
            }
        }

        Console.WriteLine("no events left");
        Console.ReadKey();
    }
}

【讨论】:

    猜你喜欢
    • 2016-01-18
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2011-12-14
    • 2013-07-24
    • 1970-01-01
    • 2013-11-21
    相关资源
    最近更新 更多