En C, ¿cómo obtengo una matriz de n números (cada uno 0x00-0xFF en mi caso), de los cuales la suma está dentro de un rango dado 0..k ?
Los números aleatorios múltiples de C ++ casi duplicados que se suman para igualar un cierto número apuntan a una suma específica, pero en mi caso, la suma puede ser cualquier cosa entre 0..k .
Debe especificar cuál es la distribución deseada de los números aleatorios.
Si no hay más requisitos, sugeriría uno de los siguientes:
(1)
Si tiene un límite superior m en el rango del número aleatorio, use min(ka[1]-... m) como límite superior del intervalo.
Desventajas: obtendrá muchos números pequeños y solo unos pocos grandes.
(2)
Desventajas: Es poco probable obtener grandes números de esta manera. Si se requieren números enteros, es probable que haya una brecha entre la suma de los números yk debido a un error de redondeo.
Creo que obtienes números "mejores" con la opción (2), pero como se indicó anteriormente, depende de los requisitos.
Suponiendo que k es menor que 255 * n , una solución es asignar k / n a cada elemento de la matriz y luego restar aleatoriamente un valor a los elementos de la matriz.
// for (int i = 0; i < n; i++) array[i] = k / n; // for (int i = 0; i < n; i++) array[i] -= randbetween(0, array[i]); for (int i = 0; i < n; i++) array[i] = randbetween(0, k / n); Esto tiene una suma esperada de k / 2 . Al modificar la función randbetween() puede cambiar la probabilidad de la suma de la matriz resultante.
Es fácil crear un número dentro del rango [0, 255] .
Es fácil identificar si k > 255*n o k < 0 no hay solución.
Si 0 <= k <= 255*n , la solución existe. Aquí solo hablamos de n > 1 condición.
Ha creado n-1 números aleatorios y la suma de los n-1 números es s1 , suponga que el n-ésimo número es x . Entonces s1 + x = k , y x debería ser [0, 255] . Si los n-1 números están todos dentro del rango [0, a] , entonces (n-1)*a + 255 >= k , obtenemos a >= (k-255)/(n-1) .
Si k > 255 , simplemente sea a = (k-255)/(n-1) . Significa que s1 es [0, k-255] . Entonces el enésimo número x puede ser cualquier número aleatorio dentro de [0, 255] . Entonces, la solución es arbitraria, seleccione n-1 números, cada uno dentro de [0, (k-255)/(n-1)] (usted sabe (k-255)/(n-1) <= 255 , por lo que cumplió su condición ), y seleccione un número aleatorio dentro de [0, 255] .
Si k <= 255 , seleccione arbitrariamente n números, cada uno dentro de [0, k/n] (usted sabe que k/n está dentro de [0, 255]).