【问题标题】:Generate random numbers with specific interval生成具有特定间隔的随机数
【发布时间】:2018-07-10 10:20:30
【问题描述】:

我正在尝试生成 3 个介于 1 和 10 之间的数字。任何两个数字之间的差必须小于/等于 2。例如:2、6、9 可以,但 2、4、7 不行(因为 4 - 2 = 2)。

private int GetGoodNumber()
{
    int lastIndex = 0;
    int x = 3;
    int randomNumber = 0;
    for (int i = 0; i < 3; i++)
    {
        int interval = UnityEngine.Random.Range(2, 7);
        do
        {
            randomNumber = interval + (UnityEngine.Random.Range(0, 10));
        } while (randomNumber > 10 || x <= 2);
        x = (lastIndex > randomNumber) ? lastIndex - randomNumber : randomNumber - lastIndex;
        lastIndex = randomNumber;
        Debug.Log(randomNumber);
    }
    return randomNumber;
}

不幸的是,我的方法不起作用,有谁知道问题所在。

【问题讨论】:

  • 继续生成直到它符合您的规格?
  • 总结一下:您想要一个随机的、有序的 1 到 10 之间的数字区间,并且它们应该至少相隔 3 步?
  • 是的......不是这三个数字之间的差小于 2
  • 但是你知道你不返回这些数字吗?你只返回最后一个,这是预期的行为吗?
  • 2、8、4可以吗?

标签: c# unity3d random


【解决方案1】:

这个规则没有太多的组合。

firstNumber 必须是 1234

基于此生成firstNumber + 37 之间的下一个。

和最后一个按同样的逻辑。

代码:

var random = new Random();
var first = random.Next(1, 4 + 1);
var second = random.Next(first + 3, 7 + 1);  
var third = random.Next(second + 3, 10 + 1);

【讨论】:

  • 不一定是+3,可以是+4或+5,在这种情况下,如果我们让firstNumber + 4,那么我们得到8,而8 + 4已经得到12,而且不好
  • 因为间隔只有1到10之间
  • @AnghelinaGuznac 我的代码运行良好。你试过了吗?第二个是从一个区间产生的,当然可以是+4或+5。并且生成的所有数字都在 1 到 10 之间。
  • 好吧,我正在测试
  • 完美,确实有效,非常感谢。这里的组合没有那么多,只有几个。
【解决方案2】:

我想我会对其进行硬编码以获得正确的分发。

var x = new [,]
{
    {1, 4, 7},
    {1, 4, 8},
    {1, 4, 9},
    {1, 4, 10},
    {1, 5, 8},
    {1, 5, 9},
    {1, 5, 10},
    {1, 6, 9},
    {1, 6, 10},
    {1, 7, 10},
    {2, 5, 8},
    {2, 5, 9},
    {2, 5, 10},
    {2, 6, 9},
    {2, 6, 10},
    {2, 7, 10},
    {3, 6, 9},
    {3, 6, 10},
    {3, 7, 10},
    {4, 7, 10}
};

【讨论】:

    【解决方案3】:

    大概是这样的:

        public static List<int> GetRandomNumbers()
        {
            List<int> result = new List<int>();
            for (int i = 0; i < 3; i++)
            {
                bool numberFit = false;
                int number = 0;
                do
                {
                    number = random.Next(0, 10);
                    numberFit = !result.Any(x => x > number - 3 && x < number + 3);
    
                } while (!numberFit);
                result.Add(number);
            }
            return result;
        }
    

    【讨论】:

    • ooo noo,对不起,我得到了 5,6,8 这样的结果,这不太好
    • 这会产生很多无效的组合,直到找到正确的组合。
    • 您的.Any 可以简化为.Any(x =&gt; x &gt; number - 3 &amp;&amp; x &lt; number + 3)
    猜你喜欢
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 2022-12-04
    • 2021-11-22
    • 1970-01-01
    • 2018-10-26
    • 2012-11-21
    • 1970-01-01
    相关资源
    最近更新 更多