Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

145
Views
¿Matriz de números aleatorios con suma en un rango dado?

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 .

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

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)

  • elige un número aleatorio a[1] en el intervalo 0 .. k
  • elija un número aleatorio a[2] en el intervalo 0 .. ka[1]
  • elija un número aleatorio a[3] en el intervalo 0 .. ka[1]-a[2]
  • ...
  • elija un número aleatorio a[n] en el intervalo 0 .. ka[1]-a[2]-...-a[n-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)

  • elige n números aleatorios a[1], .., a[n] en el intervalo 0 .. m , siendo m el límite superior
  • s = a[1]+a[2]+...+a[n]
  • multiplique cada a[i] por k/s (si se requieren números enteros, redondee hacia abajo)

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.

over 4 years ago · Santiago Trujillo Report

0

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.

over 4 years ago · Santiago Trujillo Report

0

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]).

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!