Esercizio LabView
Salve a tutti....con il software labview devo realizzare un simulatore di lancio di dadi,per fare ciò ho usato la funzione random che però genera numeri reali casuali tra 0 e 1,estremi esclusi. Ora,il dado nella realtà ha numeri interi da 1 a 6....avevo pensato di realizzare un programma che implementasse una formula che ho trovato in giro per il web :
Int(Rnd()*(max-min+1))+min
il fatto è che questa formula fornisce in uscita anche il valore 7...il che non è possibile in quanto i numeri del dado vanno da 1 a 6....come devo fare?
grazie in anticipo
Int(Rnd()*(max-min+1))+min
il fatto è che questa formula fornisce in uscita anche il valore 7...il che non è possibile in quanto i numeri del dado vanno da 1 a 6....come devo fare?
grazie in anticipo
Risposte
Si,certo....max=6, min=1,quindi 6-1=5 + 1 =6 per cui ho fatto direttamente rnd()*6
comunque può anche essere magari che la formula sia sbagliata....sono accettate anche formule alternative.
Che tipo di operazione è esattamente int? Se si tratta infatti di arrotondamento all'intero più vicino allora la formula non è corretta. La formula è infatti corretta per l'operazione di parte intera (troncamento). Infatti, moltiplicando \([0, 1)\) per \(max - min + 1\) e sommando \(min\) si ottiene l'intervallo \([min, max + 1)\). Nel tuo caso generi quindi numeri reali nell'intervallo \([1, 7)\). Prendendone la parte intera avresti che nell'intervallo \([i, i+1)\) viene generato l'intero \(i\) con distribuzione uniforme, mentre arrotondando il valore si ottiene che il numero viene generato per \((i - 0.5, i + 0.5)\) (non ricordo se l'intervallo deve essere chiuso a destra o sinistra..). Avresti quindi che verrebbero generati tutti i numeri interi da \(1\) a \(7\) con una distribuzione che non è però più uniforme (i due estremi sono meno probabili). Per risolvere il problema devi seguire una delle soluzioni seguenti:
1. Usare la funzione floor o truncate (se esistono) al posto di int (potrebbe essere necessario scrivere in realtà int(floor(..)) per via del tipo restituito talvolta da queste funzioni).
2. Adattare l'intervallo in modo da restituire valori corretti nel caso di arrotondamento. La seguente (a patto che \(-0.5\) sia convertito in \(0\)) dovrebbe funzionare:
Nel caso di arrotondamenti diversi per \(\pm0.5\), dovresti usare formule diverse.
1. Usare la funzione floor o truncate (se esistono) al posto di int (potrebbe essere necessario scrivere in realtà int(floor(..)) per via del tipo restituito talvolta da queste funzioni).
2. Adattare l'intervallo in modo da restituire valori corretti nel caso di arrotondamento. La seguente (a patto che \(-0.5\) sia convertito in \(0\)) dovrebbe funzionare:
Int(Rnd()*(max-min+1)-0.5) + min
Nel caso di arrotondamenti diversi per \(\pm0.5\), dovresti usare formule diverse.
Per approfondire un po' quello che ho scritto nell'ultimo punto, la formula che ho scritto è corretta se \(-0.5\) viene convertito in \(0\), ma non è valida per qualsiasi tipo di arrotondamento. Esistono infatti tanti metodi per arrotondare \(m.5\) (\(m\) intero). Si può ad esempio scegliere di arrotondare sempre verso l'intero più grande o più basso, oppure verso l'intero più vicino o più lontano dallo zero. Si può poi scegliere di arrotondare verso i numeri pari o verso i numeri dispari, oppure casuale o in base ad altre regole. Lo standard IEEE 754 per i numeri a virgola mobile contiene due tipi di arrotondamenti verso l'intero più vicino, uno nel quale i valori intermedi sono mandati all'intero più lontano dallo zero e l'altro nel quale viene mandato al numero pari. La formula che ho scritto funziona solo nel secondo caso. Nel caso quindi in cui l'arrotondamento sia quello verso l'intero più lontano da zero, abbiamo bisogno di una formula diversa:
In questo caso l'intervallo (prima della somma per \(min-1\)) diviene infatti \( [0.5, max - min + 1.5) \) che viene convertito in modo corretto perché \( [i - 0.5, i + 0.5) \) viene mandato in \(i\) se \(i > 0\).
Proprio per questo genere di problemi, preferisco fare uso del troncamento quando possibile.
Int( Rnd()*(max - min + 1) + 0.5 ) + min - 1
In questo caso l'intervallo (prima della somma per \(min-1\)) diviene infatti \( [0.5, max - min + 1.5) \) che viene convertito in modo corretto perché \( [i - 0.5, i + 0.5) \) viene mandato in \(i\) se \(i > 0\).
Proprio per questo genere di problemi, preferisco fare uso del troncamento quando possibile.
Vi ringrazio molto,avete colto esattamente il problema.Ho adattato l'intervallo sottraendo 0.5 ed ora il 7 non esce più. Il Labview si avvicina ai classici linguaggi di programmazione anche se ha una logica un po diversa,però la comodità sta nel fatto di non dover scrivere alcuna riga di codice,bisogna solo collegare tra loro le varie icone che rappresentano ognuna una certa funzione. Purtroppo però non ha la funzione troncamento ed appunto bisognava ricorrere a questo trucco.
Questo era solo il primo punto del progetto che devo consegnare all'esame....alla fine devo anche diagrammare la probabilità e altre cose,ma ci penserò quando ci arriverò......nel caso in cui incontri altre difficoltà, vi ringrazio in anticipo per la vostra disponibilità.
Questo era solo il primo punto del progetto che devo consegnare all'esame....alla fine devo anche diagrammare la probabilità e altre cose,ma ci penserò quando ci arriverò......nel caso in cui incontri altre difficoltà, vi ringrazio in anticipo per la vostra disponibilità.
Come sarebbe a dire che Labview non ha la funzione troncamento ?
La chiamano Round Toward -Infinity Function , è la stessa cosa.
La chiamano Round Toward -Infinity Function , è la stessa cosa.

Mi sembrava in effetti strano che uno strumento di questo tipo non disponesse di una funzione come questa..
D'accordo Sergio, le tue osservazioni sono giustissime.
La funzione che ho messo è un troncamento, cioè si prende il maggiore degli interi $\le x$
Del resto il problema iniziale parla di dadi, quindi di numeri positivi.
La funzione che ho messo è un troncamento, cioè si prende il maggiore degli interi $\le x$
Del resto il problema iniziale parla di dadi, quindi di numeri positivi.
Riapro questa discussione per cercare di risolvere un altro problema (è l'ultimo del progetto)....devo salvare su un file in formato spreadsheet tutti i risultati ottenuti. Il problema è che c'è un icona in labview che perè fornisce tabelle solo a due colonne....a me servirebbero una decina. Qualcuno sa come fare?
grazie
grazie
Risolto,ho ottenuto una matrice di 10000 righe e 10 colonne...come faccio ora ad inserire alla prima riga delle stringhe che dicano cosa rappresenta quella colonna?
grazie
grazie