Случайные числа между диапазонами A и B, которые суммируют до определенного числа - PullRequest
0 голосов
/ 25 июня 2019

Я хочу сгенерировать несколько случайных чисел, которые бы суммировали до определенного числа.

Пример:

Диапазон (10,35)

Итого (сумма): 100

Числа для генерации: 5

Каким должен быть лучший способ сделать это? Пытался написать свою собственную логику, но это выглядело довольно грязно, как псевдокод. любой алгоритм, которым я могу следовать? видел похожие вопросы, но не получил правильного ответа.

Ответы [ 4 ]

1 голос
/ 25 июня 2019

Идея может заключаться в том, чтобы учитывать тот факт, что случайность первых 4 чисел будет способствовать случайности последнего.Следуя вашему примеру:

  1. 100/5 = 20. Среднее сгенерированное число не может быть больше 20. Каждый раз, когда вы генерируете число больше 20, вы можете вычесть дельту из того, что будет сгенерировано.далее.
  2. a = rand (10, 35).Допустим, а = 20. Нам пора.
  3. b = rand (10, 35).Допустим, b = 35. У нас есть 15 дельта.
  4. c = rand (10, 35 - 15) = rand (10, 20) = 18.
  5. d = rand (10,20) = 12.
  6. e = 100 - (a + b + c + d) = 15

Теперь у вас есть 5 случайных чисел, которые составляют до 100.

Примечание: очень хорошее замечание от @derHugo.Корректировка дельты работает в обоих направлениях.Если первое число равно 10, следующим будет rand (10 + 10, 35) = rand (20, 35).И т. Д.

0 голосов
/ 25 июня 2019

Хорошо. Итак, самый простой способ: Просто сделайте цикл, который вычитает случайное число из целевого числа .. Сделайте это 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 ", ";
    }
?>
0 голосов
/ 25 июня 2019

Здесь я обновил созданный новый скрипт с массивом.Таким образом, вы можете добавить размер в совокупности, скажем, 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;
        }
    }

}

0 голосов
/ 25 июня 2019

Все, что вам нужно использовать, это 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);
    }

}
...