Saltar al contenido

Números aleatorios con suma fija

Si te encuentras con alguna parte que no comprendes puedes comentarlo y haremos todo lo necesario de ayudarte lo más rápido posible.

Solución:

JavaScript (Node.js), 122 115 bytes

N=>W=S=>2*S>N?W(N-S).map(t=>1-t):(t=(Q=s=>n?[r=s-s*Math.random()**(1/--n),...r>1?[++Q]:Q(s-r)]:[])(S,n=N),Q?t:W(S))

¡Pruébelo en línea!

pitón 2, 144128 119 bytes

from random import*
def f(n,s):
 r=min(s,1);x=uniform(max(0,r-(r-s/n)*2),r);return n<2and[s]or sample([x]+f(n-1,s-x),n)

¡Pruébelo en línea!


  • -20 bytes, gracias a Kevin Cruijssen

Java 8, 194188196237 236 bytes

n->s->double r[]=new double[n+1],d[]=new double[n],t;int f=0,i=n,x=2*s>n?1:0;for(r[n]=s=x>0?n-s:s;f<1;)for(f=1;i-->1;)r[i]=Math.random()*s;for(java.util.Arrays.sort(r);i0?1-t:t)f=(t=Math.abs(r[i]-r[i+1]))>1?0:f;return d;

+49 bytes (188 → 196 y 196 → 237) para corregir la velocidad de los casos de prueba que se acercan a 1, así como corregir el algoritmo en general.

Pruébelo en línea

Explicación:

Utiliza el enfoque en esta respuesta de StackoverFlow, dentro de un bucle, siempre que uno de los elementos siga siendo mayor que 1.
También si 2*s>n, s será transformado en n-sy se establece una bandera para indicar que debemos usar 1-diff en vez de diff en el resultado-array (gracias por el consejo @soktinpk y @l4m2).

n->s->              // Method with integer & double parameters and Object return-type
  double r[]=new double[n+1]
                     //  Double-array of random values of size `n+1`
         d[]=new double[n],
                     //  Resulting double-array of size `n`
         t;          //  Temp double
  int f=0,           //  Integer-flag (every item below 1), starting at 0
      i=n,           //  Index-integer, starting at `n`
      x=             //  Integer-flag (average below 0.5), starting at:
        2*s>n?       //   If two times `s` is larger than `n`:
         1           //    Set this flag to 1
        :            //   Else:
         0;          //    Set this flag to 0
  for(r[n]=s=        //  Set both the last item of `r` and `s` to:
       x>0?          //   If the flag `x` is 1:
        n-s          //    Set both to `n-s`
       :             //   Else:
        s;           //    Set both to `s`
      f<1;)         //  Loop as long as flag `f` is still 0
    for(f=1;         //   Reset the flag `f` to 1
        i-->1;)      //   Inner loop `i` in range (n,1] (skipping the first item)
      r[i]=Math.random()*s;
                     //    Set the i'th item in `r` to a random value in the range [0,s)
    for(java.util.Arrays.sort(r);
                     //   Sort the array `r` from lowest to highest
        i0?       //      If the flag `x` is 1:
           1-t       //       Set it to `1-t`
          :          //      Else:
           t)        //       Set it to `t`
      f=(t=Math.abs( //    Set `t` to the absolute difference of:
            r[i]-r[i+1])) 
                     //     The i'th & (i+1)'th items in `r`
        >1?          //    And if `t` is larger than 1 (out of the [0,1] boundary)
         0           //     Set the flag `f` to 0
        :            //    Else:
         f;         //     Leave the flag `f` unchanged
  return d;         //  Return the array `d` as result

No se te olvide comunicar esta reseña si si solucionó tu problema.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 3.5)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *