[Risolto] Generare una sequenza numerica
-
raffaele63
- Scoppiettante Seguace

- Messaggi: 348
- Iscrizione: lunedì 3 ottobre 2011, 12:27
- Desktop: Lubuntu
- Distribuzione: Lubuntu 22.04.1 LTS (Jammy Jellyfis
- Sesso: Maschile
[Risolto] Generare una sequenza numerica
Ciao a tutti,
sto cercando di generare una sequenza numerica, da 1 a x numero, ma casuale e non ripetitiva.
Spiego: non voglio 1-2-3 ecc, e neanche 1-5-2-1-5 ecc. Ho provato con random. randint() e con random.randrange() ma non ottengo la numerazione che voglio.
Ho anche passato diverso tempo alla ricerca nel forum, di argomenti simili, ma non sono arrivato a niente (o forse non ho visto bene), quindi se già vi è stata una discussione simile per favore indicatemela, in alternativa chiedo aiuto e all'occorrenza posterò anche il codice.
Grazie mille.
Scusatemi, ma appena chiuso mi sono accorto di non aver scritto il linguaggio: Python versione 2.6
Il codice lo posto in risposta.
sto cercando di generare una sequenza numerica, da 1 a x numero, ma casuale e non ripetitiva.
Spiego: non voglio 1-2-3 ecc, e neanche 1-5-2-1-5 ecc. Ho provato con random. randint() e con random.randrange() ma non ottengo la numerazione che voglio.
Ho anche passato diverso tempo alla ricerca nel forum, di argomenti simili, ma non sono arrivato a niente (o forse non ho visto bene), quindi se già vi è stata una discussione simile per favore indicatemela, in alternativa chiedo aiuto e all'occorrenza posterò anche il codice.
Grazie mille.
Scusatemi, ma appena chiuso mi sono accorto di non aver scritto il linguaggio: Python versione 2.6
Il codice lo posto in risposta.
Ultima modifica di raffaele63 il lunedì 28 aprile 2014, 21:10, modificato 2 volte in totale.
Bisognerebbe evitare di predicare ai giovani il successo nella solita forma come lo scopo principale nella vita.
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
- Bianco95
- Prode Principiante
- Messaggi: 31
- Iscrizione: venerdì 25 aprile 2014, 21:29
- Desktop: Unity
- Distribuzione: Ubuntu 14.04 x86_64
- Località: Susegana (Treviso)
Re: Generare una sequenza numerica
Ma che linguaggio stai usando??
Potresti postare il codice...
Potresti postare il codice...
Work Hard Dream Big
Dopo le ere della pietra, del ferro... è giunta l'era di Linux.
Dopo le ere della pietra, del ferro... è giunta l'era di Linux.
Re: Generare una sequenza numerica
Non capisco cosa vuoi ottenere: la numerazione deve essere casuale, oppure una numerazione che vuoi tu? Non colgo il senso.raffaele63 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4572730#p4572730][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Ciao a tutti,
sto cercando di generare una sequenza numerica, da 1 a x numero, ma casuale e non ripetitiva.
Spiego: non voglio 1-2-3 ecc, e neanche 1-5-2-1-5 ecc. Ho provato con random. randint() e con random.randrange() ma non ottengo la numerazione che voglio.
-
raffaele63
- Scoppiettante Seguace

- Messaggi: 348
- Iscrizione: lunedì 3 ottobre 2011, 12:27
- Desktop: Lubuntu
- Distribuzione: Lubuntu 22.04.1 LTS (Jammy Jellyfis
- Sesso: Maschile
Re: Generare una sequenza numerica
Codice: Seleziona tutto
n_sett=input("quanti settori? ")
n_sett=n_sett+1
for n in range(1,n_sett):
print nHo provato ad immettere dopo istruzione for:
Codice: Seleziona tutto
n_sett=input("quanti settori? ")
n_sett=n_sett+1
for n in range(1,n_sett):
print random.randint(1,n_sett)quanti settori? 10
11,6,6,10,6,10,2,10,2,10, allora perché vi sono 10 numeri e comprende anche 11 che non è richiesto lo so, ma io cerco una lista numerica con tutti i numeri compresi nel range richiesto. Spero di essere stato chiaro.
Bisognerebbe evitare di predicare ai giovani il successo nella solita forma come lo scopo principale nella vita.
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
- vaeVictis
- Imperturbabile Insigne

- Messaggi: 4703
- Iscrizione: venerdì 27 luglio 2012, 17:58
- Desktop: Gnome
- Distribuzione: Ubuntu 20.04 64bit
Re: Generare una sequenza numerica
Non è che sei stato il massimo della chiarezza, ma se vuoi una sequenza "mischiata" di numeri da TOT1 a TOT2, puoi usare random.shuffle
random.randint non ti garantisce estrazioni di numeri senza ripetizioni, e inoltre comprende (nelle estrazioni) i due estremi che gli passi.
A margine, non modificare il valore della variabile in questo modo:
Le fai perdere consistenza "logica" con quello che "significa".
Passa direttamente n_sett+1 a range.
Codice: Seleziona tutto
>>> import random
>>> random.shuffle
<bound method Random.shuffle of <random.Random object at 0x1dfdd00>>
>>> n_sett = 10
>>> foo = range(1, n_sett + 1)
>>> print ','.join([str(i) for i in foo])
1,2,3,4,5,6,7,8,9,10
>>> random.shuffle(foo)
>>> print ','.join([str(i) for i in foo])
8,5,6,4,7,2,3,10,9,1
>>> random.shuffle(foo)
>>> print ','.join([str(i) for i in foo])
10,1,2,4,7,6,9,8,3,5
>>> random.shuffle(foo)
>>> print ','.join([str(i) for i in foo])
9,10,6,8,3,1,5,7,2,4
>>> random.shuffle(foo)
>>> print ','.join([str(i) for i in foo])
10,2,5,9,3,7,4,6,8,1
A margine, non modificare il valore della variabile in questo modo:
Codice: Seleziona tutto
n_sett=n_sett+1Passa direttamente n_sett+1 a range.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
-
raffaele63
- Scoppiettante Seguace

- Messaggi: 348
- Iscrizione: lunedì 3 ottobre 2011, 12:27
- Desktop: Lubuntu
- Distribuzione: Lubuntu 22.04.1 LTS (Jammy Jellyfis
- Sesso: Maschile
Re: Generare una sequenza numerica
Ciao, avevo provato ieri sera shuffle, ma da novello sbagliavo il metodo di abbinamento. A dire il vero avevo pensato anche a set (con random.random) ma non mi suonava bene ed ho avuto ragione perché la strada era un'altra. Studiando (le pagine del tutorial e della libreria sono tanteeeee) e con qualche aiutino faccio progressi. Grazie. (ora metto risolto)
Bisognerebbe evitare di predicare ai giovani il successo nella solita forma come lo scopo principale nella vita.
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
- vaeVictis
- Imperturbabile Insigne

- Messaggi: 4703
- Iscrizione: venerdì 27 luglio 2012, 17:58
- Desktop: Gnome
- Distribuzione: Ubuntu 20.04 64bit
Re: [Risolto] Generare una sequenza numerica
il metodo di abbinamento?Ciao, avevo provato ieri sera shuffle, ma da novello sbagliavo il metodo di abbinamento
p.s.:
Se qualcosa del codice che ti ho postato non ti è chiara, chiedi pure eh!da novello
Ho usato un paio di cose che potresti ancora non aver visto. Vedi tu.
Ciao.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
-
raffaele63
- Scoppiettante Seguace

- Messaggi: 348
- Iscrizione: lunedì 3 ottobre 2011, 12:27
- Desktop: Lubuntu
- Distribuzione: Lubuntu 22.04.1 LTS (Jammy Jellyfis
- Sesso: Maschile
Re: [Risolto] Generare una sequenza numerica
Ho trovato in internet questo mini tutorial: Python tips & tricks. nelle pagine vi sono diversi esempi e da li ho preso una parte di codice relativo a random (vedi sotto):
La parte di codice (sys eccetera) la uso in altra parte di codice, senza shuffle ma con randint) e li mi andava bene.
p.s.:
Ho usato un paio di cose che potresti ancora non aver visto. Vedi tu.
Ciao.[/quote]
In effetti qualche chiarimento non farebbe male. Ad esempio la variabile "foo" è una variabile a se stante o ha un significato particolare? Invece per join?
Codice: Seleziona tutto
n_sett=input("quanti settori? ")
n_sett=n_sett+1
for n in range(1,n_sett):
sys.stdout.write(str(random.shuffle(1,n_sett)))p.s.:
Se qualcosa del codice che ti ho postato non ti è chiara, chiedi pure eh!da novello
Ho usato un paio di cose che potresti ancora non aver visto. Vedi tu.
Ciao.[/quote]
In effetti qualche chiarimento non farebbe male. Ad esempio la variabile "foo" è una variabile a se stante o ha un significato particolare? Invece per join?
Bisognerebbe evitare di predicare ai giovani il successo nella solita forma come lo scopo principale nella vita.
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
- vaeVictis
- Imperturbabile Insigne

- Messaggi: 4703
- Iscrizione: venerdì 27 luglio 2012, 17:58
- Desktop: Gnome
- Distribuzione: Ubuntu 20.04 64bit
Re: [Risolto] Generare una sequenza numerica
1) Ti sconsiglio caldamente di imparare a programmare studiando sui vari tutorial online. Usa la via "canonica" (libro
)
2) Il metodo random.shuffle "mischia" in place una lista. Quella variabile che ho chiamato foo è una lista (in questo caso di interi) che poi viene passata al metodo random.shuffle per essere sottoposta, appunto, ad uno shuffle.
Per in place si intende che ti "opera" sull'oggetto che passi al metodo, modificandolo.
Questa istruzione del tuo codice:
non funziona, perché non gli stai passando una lista:
a differenza che con randint, caso in cui ti funziona:
2) Il metodo random.shuffle "mischia" in place una lista. Quella variabile che ho chiamato foo è una lista (in questo caso di interi) che poi viene passata al metodo random.shuffle per essere sottoposta, appunto, ad uno shuffle.
Per in place si intende che ti "opera" sull'oggetto che passi al metodo, modificandolo.
Questa istruzione del tuo codice:
Codice: Seleziona tutto
random.shuffle(1,n_sett)Codice: Seleziona tutto
>>> random.shuffle(1,12)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/random.py", line 285, in shuffle
for i in reversed(xrange(1, len(x))):
TypeError: object of type 'int' has no len()
Codice: Seleziona tutto
>>> random.randint(1,12)
9Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
- vaeVictis
- Imperturbabile Insigne

- Messaggi: 4703
- Iscrizione: venerdì 27 luglio 2012, 17:58
- Desktop: Gnome
- Distribuzione: Ubuntu 20.04 64bit
Re: [Risolto] Generare una sequenza numerica
p.s.: Anche se mi aspettavo la domanda, mi è sfuggita quella su join.
È un metodo degli iterabili di Python.
Come ti viene spiegato nell'help:
Gli passi un iterabile e lui ti ritorna una "stringa" in cui gli elementi (dell'iterabile che gli hai passato) sono separati dall'elemento S.
Ad esempio, se la applichi ad una "stringa", che per Python è un iterabile, ottieni:
Ora, nel caso dell'esempio che ho fatto nel precedente messaggio, tu hai un altro tipo di iterabile iterabile (la lista foo) che contiene numeri
Non puoi applicare direttamente il metodo str.join, perché gli elementi dell'iterabile (foo) che gli passi devono a loro volta essere stringhe:
Per questo motivo, ho passato una cosa "diversa" da foo.
Se vedi, l'argomento passato al metodo str.join è:
Questa sintassi si chiama "list comprehension" ed è un modo per generare le liste.
Ho quindi passato a str.join una lista i cui elementi sono quelli di foo, trasformati in stringhe.
Ora... fare questo passaggio tutte le volte è ovviamente uno spreco di risorse. Per fortuna il metodo random.shuffle funziona anche con liste i cui elementi siano "lettere" e non "numeri", quindi puoi fare la "trasformazione" da lista di numeri in lista di lettere solo una volta, all'inizio, e poi passare a join direttamente la lista modificata:
Ovviamente, questo "metodo" non funziona se tu poi devi fare dei conti sugli elementi mischiati.
Era solo per darti qualche spunto di approfondimento
Ciao.
È un metodo degli iterabili di Python.
Come ti viene spiegato nell'help:
Codice: Seleziona tutto
>>> help(str.join)
...
Help on built-in function join:
join(...)
S.join(iterable) -> string
Return a string which is the concatenation of the strings in the
iterable. The separator between elements is S.
Ad esempio, se la applichi ad una "stringa", che per Python è un iterabile, ottieni:
Codice: Seleziona tutto
>>> foo = "StringaDiProva"
>>> ','.join(foo)
'S,t,r,i,n,g,a,D,i,P,r,o,v,a'
Codice: Seleziona tutto
>> foo = range(1,10)
>>> foo
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Codice: Seleziona tutto
>>> ','.join(foo)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected string, int found
Se vedi, l'argomento passato al metodo str.join è:
Codice: Seleziona tutto
<type 'str'>
>>> [ str(i) for i in foo ]
['1', '2', '3', '4', '5', '6', '7', '8', '9']
Ho quindi passato a str.join una lista i cui elementi sono quelli di foo, trasformati in stringhe.
Ora... fare questo passaggio tutte le volte è ovviamente uno spreco di risorse. Per fortuna il metodo random.shuffle funziona anche con liste i cui elementi siano "lettere" e non "numeri", quindi puoi fare la "trasformazione" da lista di numeri in lista di lettere solo una volta, all'inizio, e poi passare a join direttamente la lista modificata:
Codice: Seleziona tutto
>>> bar = [ str(i) for i in foo ]
>>> bar
['1', '2', '3', '4', '5', '6', '7', '8', '9']
>>> random.shuffle(bar)
>>> print ','.join(bar)
4,3,7,9,2,5,8,1,6Era solo per darti qualche spunto di approfondimento
Ciao.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
-
raffaele63
- Scoppiettante Seguace

- Messaggi: 348
- Iscrizione: lunedì 3 ottobre 2011, 12:27
- Desktop: Lubuntu
- Distribuzione: Lubuntu 22.04.1 LTS (Jammy Jellyfis
- Sesso: Maschile
Re: [Risolto] Generare una sequenza numerica
Veramente grazie!
Ho apprezzato molto la spiegazione e la semplicità con la quale hai spiegato il percorso da seguire e come.
Studiare da solo (sui libri) alle volte non è sufficiente perché sfugge sempre qualcosa, per questo provo e riprovo cercando anche in rete qualcosa, ma come hai caldamente suggerito, on-line si trova materiale non descritto correttamente.
Ciao!
Ho apprezzato molto la spiegazione e la semplicità con la quale hai spiegato il percorso da seguire e come.
Studiare da solo (sui libri) alle volte non è sufficiente perché sfugge sempre qualcosa, per questo provo e riprovo cercando anche in rete qualcosa, ma come hai caldamente suggerito, on-line si trova materiale non descritto correttamente.
Ciao!
Bisognerebbe evitare di predicare ai giovani il successo nella solita forma come lo scopo principale nella vita.
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
Chi c’è in linea
Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti