Estoy tratando de codificar (JavaScript o VB.NET) un algoritmo para generar x números aleatorios. Cada número aleatorio debe estar dentro de un cierto rango y la suma total de todos los números debe ser igual a una constante. Particularmente, no necesito el código exacto (si lo necesito, siempre puedo preguntar cuándo empiezo a depurar), sino solo la lógica detrás de todo.
En mi caso particular: necesito generar 4 números aleatorios, cada uno entre 0 y 10, y la suma total de los números generados aleatoriamente debe ser 24.
Si necesita más información: por favor pregunte. Gracias de antemano por tratar de resolver esto conmigo 🙂.
EDITAR : Debería haber agregado lo que ya probé (el código está en VB.NET pero no es tan difícil, así que ...) Según esta respuesta de StackOverflow, esto es lo que ya probé (aunque no funciona):
Dim intAverageNumberMark As Integer = 24 / 4 Dim intOverMark As Integer = 0 Dim intGeneratedRandomNumber As Integer = 0 Dim intCurrentSumOfRandomNumbers = 0 For intCounter = 0 To intNumberOfTowers - 1 intGeneratedRandomNumber = RandomNumber(0 + intGeneratedRandomNumber, 10) intOverMark = If(intGeneratedRandomNumber > intAverageNumberMark, intGeneratedRandomNumber - intAverageNumberMark, 0) If intCounter = intNumberOfTowers - 1 Then intNumbers(intCounter) = 24 - intCurrentSumOfRandomNumbers End If intNumbers(intCounter) = intGeneratedRandomNumber intCurrentSumOfRandomNumbers += intGeneratedRandomNumber Debug.Print(intGeneratedRandomNumber) Next intNumbers() es una matriz declarada con Dim intNumbers(7) As Integer .
sum = 0; loop generate new number if sum + new number <= constant{ sum += new number break out of loop }El enfoque más fácil es tomar un método de fuerza brte y generar todas las combinaciones posibles y tomar una selección aleatoria de este conjunto de resultados.
function generate(from, to, size, sum) { function iter(right, delta) { if (delta < 0) return; if (!delta && right.length === size) return result.push(right); if (!delta || right.length === size) return; for (let i = from; i <= Math.min(delta, to); i++) iter([...right, i], delta - i); } const result = []; iter([], sum); return result; } const result = generate(0, 10, 4, 24); console.log(result.length); document.getElementById('out').innerHTML += result.map(a => a.map(v => v.toString().padStart(2, ' ')).join(' ')).join('\n'); <pre id="out"></pre>Si todo lo que está buscando es el algoritmo, este es el enfoque que tomaría:
Una cosa que creo que debo señalar es que los números se volverán cada vez más no aleatorios a medida que C se acerca a 0; la velocidad con la que esto ocurre depende de los límites superior e inferior de su número aleatorio en comparación con C.
También puede averiguar algunos puntos de datos adicionales sobre este algoritmo, como cuántas veces se ejecuta el ciclo (cuántos números generó).