Unity3d 介于a和B之间的随机数,其总和为特定数

Unity3d 介于a和B之间的随机数,其总和为特定数,unity3d,game-development,Unity3d,Game Development,我希望生成一些随机数,将总结到一个特定的数字 例如: 射程(10,35) 总数(总和):100 要生成的数字:5 最好的方法是什么?我试图编写自己的逻辑,但它看起来像psudo代码一样凌乱。有什么我可以遵循的算法吗?看到类似的问题,但没有得到任何正确的答案

我希望生成一些随机数,将总结到一个特定的数字

例如:

射程(10,35)

总数(总和):100

要生成的数字:5


最好的方法是什么?我试图编写自己的逻辑,但它看起来像psudo代码一样凌乱。有什么我可以遵循的算法吗?看到类似的问题,但没有得到任何正确的答案
  • 100/5=20。生成的平均数不能大于20。每次生成大于20的数字时,可以将增量减去下一个生成的值
  • a=兰特(10,35)。假设a=20。我们可以走了
  • b=兰特(10,35)。假设b=35。我们有15个三角洲
  • c=兰特(10,35-15)=兰特(10,20)=18
  • d=兰德(10,20)=12
  • e=100-(a+b+c+d)=15
  • 现在有5个随机数,加起来等于100


    注:来自@derHugo的非常好的评论。增量调整是双向的。如果第一个数字是10,那么下一个数字将是兰德(10+10,35)=兰德(20,35)。等等。

    您所要使用的就是
    System.Random
    来生成范围之间的随机数,然后在检查总和是否等于结果的同时继续添加它们

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class RandomNumberGenerationWithSum : MonoBehaviour
    {
    
        string output = "";
        int sum = 0;
        int result = 100;    //Give the sum
    
        void Start()
        {
            System.Random r = new System.Random();
    
            while (sum != result)
            {
                int add;
                if ((result - sum) > 35) //maximum limit
                {
                    add = r.Next(10, 35); //define the range
                }
                else
                {
                    add = r.Next(result - sum + 1);
                }
    
                sum += add;
                output += add.ToString() + " + ";
            }
    
            output = output.Remove(output.Length - 2);
    
            Debug.Log("Output: " + output);
        }
    
    }
    

    在这里,我更新了一个脚本,创建了一个带有数组的新脚本。所以你可以加上人口的规模,比如说5。因此,只会生成5个随机数来添加值以获得结果。希望这有帮助

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class RandomInitial : MonoBehaviour
    {
    
        public int[] population;
        int result = 100;    //Give the sum
        int z;
        private bool Check = true;
    
        void Start()
        {
    
    
        }
    
        void Update()
        {
            if (Check == true)
            {
    
                for (int i = 0; i < population.Length; i++)
                {
                    population[i] = Random.Range(10, 35);
                }
    
                for (int i = 0; i < population.Length; i++)
                {
                    z += population[i];
                }
                Debug.Log("value " + z);
            }
    
            if (z == result)
            {
                Debug.Log("Success");
                Check = false;
            }
            else
            if (z != result)
            {
                z = 0;
            }
        }
    
    }
    
    
    使用系统集合;
    使用System.Collections.Generic;
    使用UnityEngine;
    公共类:单一行为
    {
    公共人口;
    int result=100;//给出总和
    intz;
    私有布尔检查=真;
    void Start()
    {
    }
    无效更新()
    {
    如果(检查==true)
    {
    for(int i=0;i
    好的。。因此,最简单的方法是: 只要做一个循环,从目标数中减去随机数。。 做n-1次,检查剩下的那一个是否在范围内。。 我将用php编写代码,然后在这里发布

    编辑:在这里

    注意:它确实有效,但它不是无错误的,您必须添加一些防御内容,因此它不会超过$targetNum

    <?php
        $targetNum = 100;
        $randMin =10;
        $randMax = 35;
        $generateNum = 5;
    
        $numArray = array();
    
        $numLeft=$targetNum;
    
        for($i = 0; $i<$generateNum-1;$i++){
            $numArray[$i] = rand($randMin,$randMax);
            $numLeft -= $numArray[$i];
            if($i==$generateNum-2){
                $numArray[$i+1] = $numLeft;
            }
        }
        for($i = 0; $i<$generateNum;$i++){
            echo $numArray[$i];
            echo ", ";
        }
    ?>
    

    我按照Zedka29的答案编写了这段JavaScript代码,但在选择不同数量的数字生成时遇到了一些错误。在您的示例中,如果20是范围的最大值,那么您最终会留下一个间隙,因为在这种情况下,第一个数字可能会小于20

    函数genRand(最小值、最大值、目标值、numItems){
    设total=0;
    设maxNum=数学地板(目标/分钟);
    设minNum=Math.ceil(target/max);
    如果(!numItems)numItems=Math.floor(Math.random()*(maxNum-minNum)+minNum);
    设平均值=数学圆(目标/单位);
    设t=0;
    而(total目标){
    tmp=目标-总数;
    }
    否则如果(总计+tmp>目标-分钟){
    tmp+=目标-(总量+tmp);
    如果(tmp>最大值){
    //出什么事了
    }
    }
    否则{
    如果(tmpavg){
    最大值-=(tmp-平均值);
    } 
    }
    总+=tmp;
    log(tmp+',新的最小值:'+min+',新的最大值:'+max);
    console.log('total:'+total);
    ++尝试;
    } 
    console.log('numItems'+numItems);
    log('nums生成:'+尝试);
    }
    
    genRand(10,20100,5)到目前为止你都试了些什么?那些类似的问题在哪里?类似的问题:这听起来像是我在学校做的数学测试。你有没有想过你将如何成功@MuhammadFarhanAqeel?如果随意地将前4个值都设置为
    10
    ,会发生什么?然后
    e=60
    ,不在
    10,35
    ;)的范围内你可能需要对我刚才回答你的范围下限进行相同的delta调整:)是的,没错,这在我的例子中并不明显。我会说清楚的。它可以创建比所需更少或更多的数字。然后我猜从上面的脚本中,他可以创建一个大小为5的数组,并将随机生成的值推送到数组中。填充数组后,他可以检查5个值的相加是否等于100,如果不等于100,则弹出最后输入的值并推送一个新值,然后再次检查。重复这样做直到得到结果。这会在每一帧生成新的随机值,直到您意外地找到一组匹配的数字。。。最终。。1.不是很有效率,2。不可靠。。可能在5分钟后,您仍然没有有效的result@derHugo是的,如果目标值为100且人口高于5,则不可靠,但确实得到了用户要求的结果。*从不可靠我认为就我理解你的意思而言,它不起作用。在本例中,如果3次拾取35