Come faccio ad avere un gruppo di numeri il cui totale non supera un limite, e ogni numero deve essere = 0?

1

Supponiamo di avere una matrice di n numeri. Le regole per l'array sono le seguenti:

  1. Tutti i numeri devono aggiungere fino a 1000
  2. Se un numero cambia (positivo o negativo), tutti gli altri numeri nell'array devono essere regolati in modo che la somma dell'array sia ancora 1000
  3. La parte difficile: tutti i numeri devono essere maggiori o uguali a 0.

I numeri 1 e 2 possono essere facilmente ottenuti ottenendo il delta di cambiamento e diffondendo il delta tra gli altri numeri. Il trucco è la condizione 3.

C'è una domanda che chiede la sua applicazione. I numeri sono percentuali da inserire nel grafico a torta; l'utente può regolare ogni segmento di torta con un cursore. Poiché si tratta di un grafico a torta che utilizza percentuali, tutti i cursori devono aggiungere fino al 100%, ovvero se l'utente trascina il cursore per ridurre le dimensioni di una porzione di torta, tutte le altre fette di torta dovrebbero aumentare. Nessuna fetta della torta deve essere inferiore a 0 o superiore a 100.

    
posta Extrakun 08.01.2016 - 08:37
fonte

2 risposte

4

Fondamentalmente, l'intervallo è compreso tra 0 e 1000. Quando viene modificato un valore, il nuovo intervallo è da 0 a sum (N). Si vuole quindi normalizzare da 0 a 1000. Quindi si calcola la frazione del totale per ogni valore e quindi più per 1000. Ogni valore viene quindi moltiplicato per 1000 / sum (N). Ecco un esempio:

[100,100,300,500]

Ora supponiamo di cambiare un valore:

[100,300,300,500] # sums to 1200

Ora più valori per 1000/1200. (L'intervallo che vuoi diviso per la somma che hai.)

[83, 250, 250, 417] # sums to 1000

Aggiornamento

Come @AProgrammer fa notare, a seconda di come ti giri, potresti essere fuori da uno. Probabilmente vorrai utilizzare il pavimento come risultato e aggiungerne uno alle voci fino a raggiungere la somma desiderata. In alternativa, se le API che lo consumano possono utilizzare valori in virgola mobile, usa quelli.

    
risposta data 08.01.2016 - 09:34
fonte
2

Come un problema di programmazione , ci sono molte risposte facili a questo; tre quick brainstorming:

  • Quando aumenti una sezione, riduci la dimensione dell'ultima porzione con una dimensione maggiore di zero di una quantità equivalente.
  • Quando aumenti una sezione, riduci la dimensione della sezione più grande di una quantità equivalente.
  • Quando si aumenta una porzione, ridurre la dimensione di tutte le altre fette in proporzione ai valori correnti. Ad esempio, se le tue fette di dimensioni attuali (10, 20, 30, 40) e hai aumentato la sezione 40 a 46, distribuisci questa riduzione tra le altre sezioni nel rapporto 1: 2: 3, quindi finisci con (9, 18, 27, 46).

E algoritmi equivalenti abbastanza ovvi per ridurre una fetta.

Tuttavia, questo è probabilmente più interessante come problema UX - quale algoritmo produce il comportamento più "intuitivo"? Pertanto, potrebbe essere utile chiedere a Esperienza utente .

    
risposta data 08.01.2016 - 09:34
fonte

Leggi altre domande sui tag