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