Punto informatico Network
Login Esegui login | Non sei registrato? Iscriviti ora (è gratuito!)
Username: Password:
  • Annuncio Pubblicitario

Selezione random da una lista (Basic)

Il forum per tutti i developer. Leggere attentamente il regolamento di sezione prima di postare.

Selezione random da una lista (Basic)

Messaggioda mortal_kombat » lun set 17, 2007 3:02 pm

Saluti a tutti,
qualcuno mi sa dare qualche consiglio su come posso selezionare da una lista (di caratteri, inserita da me) un elemento casuale per poi introdurlo in un'altra lista in maniera ordinata?


Mi spiego meglio (spero):

Io ho una lista introdotta da me del tipo:

a = ['1', '2', '3', ..., '9', '0']

Da questa lista voglio selezionare l'elemento a[j], in cui

j = Rnd(0, 9)

e metterlo nella lista b, dove

DIM b AS string[]

in posizione b[i] con

FOR i = 0 to 5 STEP 1

e

INC i


Tutto questo che vi ho scritto (ovviamente non è il codice ma una bovina semplificazione, è solo per farvi capire che razza di istruzioni ho inserito nel mio programmino) non funziona assolutamente.
Lo scopo è quello di ottenere un programma che generi delle sequenze casuali di caratteri, in parole povere un generatore di password sicure [std] . Quando avvio il programma la console non mi restituisce nessun messaggio di errore e nemmeno il risultato che vorrei...
Consigli da darmi?

Vi ringrazio [^]
Avatar utente
mortal_kombat
Senior Member
Senior Member
 
Messaggi: 458
Iscritto il: dom giu 24, 2007 5:36 pm
Località: Pisa

Messaggioda Silver Black » lun set 17, 2007 3:19 pm

Non capisco dov'è il punto esatto in cui ti incarti:

il numero casuale riesci a estrarlo?
riesci a estrarre un elemento casuale dall'array?
riesci a inserire l'elemento estratto nel nuovo array?
riesci a ordinare il nuovo array?
Sergio Pappalardo aka Silver Black
https://www.silvercybertech.com
Avatar utente
Silver Black
Silver Member
Silver Member
 
Messaggi: 1148
Iscritto il: gio gen 06, 2005 8:50 pm
Località: Italia

Messaggioda mortal_kombat » lun set 17, 2007 3:26 pm

Allora... la risposta precisa... non la conosco.
O meglio:
per capire dove fosse il problema, ho creato un altro progetto "terminale" in modo da poter seguire meglio ogni singola stringa inserita. Ho copiato il codice a piccoli pezzi ma il problema non lo riesco ad individuare proprio perché non mi dà nessun messaggio di errore di nessun tipo né nessun risultato!
Ho provato a mettere un print a[j] dopo aver generato il j random e la console mi restituisce un carattere della mia lista (quindi la risposta alle prime due domande che mi poni è "sì"), poi non credo che il programma riesca ad inserire il valore a[j] in b[i ], io questa istruzione l'ho data (in un ciclo do) scrivendo b[i] = a[j].

Spero di essere chiara...
Avatar utente
mortal_kombat
Senior Member
Senior Member
 
Messaggi: 458
Iscritto il: dom giu 24, 2007 5:36 pm
Località: Pisa


Messaggioda Silver Black » lun set 17, 2007 3:50 pm

mortal_kombat ha scritto:Ho provato a mettere un print a[j] dopo aver generato il j random e la console mi restituisce un carattere della mia lista (quindi la risposta alle prime due domande che mi poni è "sì"),


Ok.

poi non credo che il programma riesca ad inserire il valore a[j] in b[i ], io questa istruzione l'ho data (in un ciclo do) scrivendo b[i] = a[j].


Allora, devi inserire nel nuovo array alla posizione i. Ponendo quindi che in vetOriginal ci sia la tua lista da cui estrarre casualmente un elemento, che in strNewChar ci sia il carattere scelto casualmente da vetOriginal e che in vetNew sia il nuovo array, farai:

Codice: Seleziona tutto
for i = LBound(vetNew) to UBound(vetNew) do
  'estrai casualmente un carattere da vetOriginal
  strNewChar = <funzione che estrae casualmente da netNew>
  'mette il nuovo carattere nel nuovo array:
  vetNew(i) = strNewChar
next i


Alla fine del ciclo for avrai il vettore vetNew con i caratteri scelti in modo casuale. A questo punto quindi potrai ordinarlo con un algoritmo di ordinamento qualsiasi, es. il facile BubbleSort o l'efficiente QuickSort.
Sergio Pappalardo aka Silver Black
https://www.silvercybertech.com
Avatar utente
Silver Black
Silver Member
Silver Member
 
Messaggi: 1148
Iscritto il: gio gen 06, 2005 8:50 pm
Località: Italia

Messaggioda mortal_kombat » lun set 17, 2007 4:07 pm

Ok, ti ringrazio [;)]
Se te mi dici di mettere:

Codice: Seleziona tutto
...
vetNew(i) = strNewChar
...


Allora, se ho capito bene, sbagliavo a precisare un indice per l'elemento del mio array b?
[uhm] [uhm] [uhm] [uhm] [uhm]
Avatar utente
mortal_kombat
Senior Member
Senior Member
 
Messaggi: 458
Iscritto il: dom giu 24, 2007 5:36 pm
Località: Pisa

Messaggioda Silver Black » lun set 17, 2007 4:18 pm

mortal_kombat ha scritto:Ok, ti ringrazio [;)]


E di che! [std]


Allora, se ho capito bene, sbagliavo a precisare un indice per l'elemento del mio array b? [uhm] [uhm] [uhm] [uhm] [uhm]


No, l'indice dovevi precisarlo, ma tu mettevi due indici diversi, quindi due cicli for annidati e non capisco perché. Secondo me così - non posso dirlo con sicurezza se non vedo tutto il codice - andavi a sovrascrivere i vecchi valori inseriti nel nuovo array.

NOTA: inserisci nomi significativi per le variabili (es. non A o B ma vetOriginal e vetNew; non X o Y ma intCodice e intIndiceSelezionato)!!!
Sergio Pappalardo aka Silver Black
https://www.silvercybertech.com
Avatar utente
Silver Black
Silver Member
Silver Member
 
Messaggi: 1148
Iscritto il: gio gen 06, 2005 8:50 pm
Località: Italia

Messaggioda mortal_kombat » lun set 17, 2007 4:24 pm

Silver Black ha scritto:No, l'indice dovevi precisarlo, ma tu mettevi due indici diversi, quindi due cicli for annidati e non capisco perché.


Mumble mumble... ma se io definisco lo stesso indice random, alla fine nel vettore che voglio la disposizione dei caratteri è random, mentre la mia idea di partenza era quella di selezionare un carattere random dalla lista principale e metterlo in una posizione con indice crescente del nuovo vettore (per questo ho messo due indici ma un solo ciclo for, dal momento che quello che ho chiamato j in effetti non era un vero e proprio ciclo for...)

Silver Black ha scritto:Secondo me così - non posso dirlo con sicurezza se non vedo tutto il codice - andavi a sovrascrivere i vecchi valori inseriti nel nuovo array.


Purtroppo ora il codice non ce l'ho, comunque stasera cerco di fare queste prove e cerco di comunicare l'esito

Ti ringrazio per ora
Avatar utente
mortal_kombat
Senior Member
Senior Member
 
Messaggi: 458
Iscritto il: dom giu 24, 2007 5:36 pm
Località: Pisa

Messaggioda Silver Black » lun set 17, 2007 5:00 pm

mortal_kombat ha scritto:Mumble mumble... ma se io definisco lo stesso indice random, alla fine nel vettore che voglio la disposizione dei caratteri è random, mentre la mia idea di partenza era quella di selezionare un carattere random dalla lista principale e metterlo in una posizione con indice crescente del nuovo vettore (per questo ho messo due indici ma un solo ciclo for, dal momento che quello che ho chiamato j in effetti non era un vero e proprio ciclo for...)


Cosa vuol dire "definisco lo stesso indice random"? Non devi INSERIRE i valori CASUALMENTE nell'array, ma sono i valori che devono essere ESTRATTI casualmente, poi saranno inseriti nell'array in ordine riempiendo via via tutte le celle dell'array, dalla prima all'ultima.


Purtroppo ora il codice non ce l'ho, comunque stasera cerco di fare queste prove e cerco di comunicare l'esito


Se vuoi mostrarmi il codice ti dico dove sbagli. Ma dovresti averlo capito! Il mio pseudo-codice ti fa ottenere un array finale con gli elementi estratti casualmente dall'array originale.

Come fai a non avere il tuo codice? [...]


Ti ringrazio per ora


Prego!
Sergio Pappalardo aka Silver Black
https://www.silvercybertech.com
Avatar utente
Silver Black
Silver Member
Silver Member
 
Messaggi: 1148
Iscritto il: gio gen 06, 2005 8:50 pm
Località: Italia

Messaggioda mortal_kombat » lun set 17, 2007 5:09 pm

Beh, il mio codice non ce l'ho perché sono al lavoro ed il programmino (scritto nel tempo libero) è nel mio pc personale.

Comunque, tornando all'argomento principale, se non provo quello che mi hai detto non posso sapere se andrà bene.

Sì comunque ho capito cosa devo fare [:)]
Avatar utente
mortal_kombat
Senior Member
Senior Member
 
Messaggi: 458
Iscritto il: dom giu 24, 2007 5:36 pm
Località: Pisa

Messaggioda mortal_kombat » mar set 18, 2007 8:07 am

Ho fatto le modifiche ma purtroppo non va nemmeno così.
Riporto il pezzo di codice:

Codice: Seleziona tutto
DIM ObjList AS String[]   'Lista di elementi originale
DIM NewList AS NEW String[]   'Lista di elementi "random" presi da ObjList
DIM ExtVal AS String   'Valore estratto
DIM i AS Integer   'Indice del ciclo for
DIM j AS Integer   'Indice random

ObjList = [ "0", "1", ... , "9"]

FOR i = 0 TO 6
   DO
      j = Int(Rnd(0, 10))
      ExtVal = ObjList[j]
      NewList[i] = ExtVal
   LOOP
   Inc i
NEXT


Mi dà il seguente errore:

Out of bounds


Alla riga: NewList[i] = ExtVal

Qualcuno sa darmi una mano?
Grazie in anticipo
Avatar utente
mortal_kombat
Senior Member
Senior Member
 
Messaggi: 458
Iscritto il: dom giu 24, 2007 5:36 pm
Località: Pisa

Messaggioda Silver Black » mar set 18, 2007 10:26 am

mortal_kombat ha scritto:
Codice: Seleziona tutto
DIM ObjList AS String[]   'Lista di elementi originale
DIM NewList AS NEW String[]   'Lista di elementi "random" presi da ObjList
DIM ExtVal AS String   'Valore estratto
DIM i AS Integer   'Indice del ciclo for
DIM j AS Integer   'Indice random

ObjList = [ "0", "1", ... , "9"]

FOR i = 0 TO 6
   DO
      j = Int(Rnd(0, 10))
      ExtVal = ObjList[j]
      NewList[i] = ExtVal
   LOOP
   Inc i
NEXT


Mi dà il seguente errore:

Out of bounds


Alla riga: NewList[i] = ExtVal


perché 1) non si dichiarano gli array come hai fatto tu, 2) devi ridimensionarli prima di inizializzarli, con la Redim.

Fai prima a dichiararli statici, visto che non ti serve ridimensionarli a run-time. Quindi la dichiarazione corretta è la seguente (bada alla notazione ungherese):

Dim vetObjList(10) as String
Dim vetNewList(10) as String

Queste dichiarazioni corrette creano due array di 10 elementi, da 0 a 9. A questo punto puoi direttamente inizializzarli assegnando loro gli elementi che vuoi tu.

Altra cosa: ma chi ti ha detto che si mettono le parentesi quadrate in VB per dichiarare gli array? [...] E quel "New" nella dichiarazione dell'altro array perché l'hai messo? Voglio capire cosa pensavi, perché un array dichiarato in un modo e uno in un altro? [...] E il Do...Loop in un ciclo For che c'entra?! [...] E Int prima di Rnd non c'entra perché Rnd estrae già un intero. [...]

[!!!] Ehi, devi leggere un po' di documentazione, almento sulla dichiarazione delle variabili e sui costrutti (cicli iterattivi, ecc.) prima di cimentarti in un programma, o almeno man mano che vai avanti col programma.
Sergio Pappalardo aka Silver Black
https://www.silvercybertech.com
Avatar utente
Silver Black
Silver Member
Silver Member
 
Messaggi: 1148
Iscritto il: gio gen 06, 2005 8:50 pm
Località: Italia

Messaggioda mortal_kombat » mar set 18, 2007 10:36 am

1. Metto le parentesi tonde per farmi dare un bel illegal error?
2. Il do ... loop in un ciclo for non me lo avevi consigliato te ieri?
3. Ho provato a dimensionare le array prima di inizializzarle (con le parentesi []) ma mi dava lo stesso identico errore.
4. Rnd non estrae un intero, sulla guida del programma che uso c'è scritto almeno 20 volte di precisare Int se si vuole un intero, se proprio vogliamo mettere i puntini sulle i
5. Di documentazione ne ho letta parecchia, se non vuoi darmi una mano ignora il mio messaggio ma nessuno ti autorizza a rispondermi così.

Grazie comunque, mi rivolgerò a gente più esperta
Avatar utente
mortal_kombat
Senior Member
Senior Member
 
Messaggi: 458
Iscritto il: dom giu 24, 2007 5:36 pm
Località: Pisa

Messaggioda Silver Black » mar set 18, 2007 10:47 am

mortal_kombat ha scritto:1. Metto le parentesi tonde per farmi dare un bel illegal error?
2. Il do ... loop in un ciclo for non me lo avevi consigliato te ieri?
3. Ho provato a dimensionare le array prima di inizializzarle (con le parentesi []) ma mi dava lo stesso identico errore.
4. Di documentazione ne ho letta parecchia, se non vuoi darmi una mano ignora il mio messaggio ma nessuno ti autorizza a rispondermi così.

Grazie comunque, mi rivolgerò a gente più esperta


Ma che compilatore usi? Non stai usando Visual Basic? Ti assicuro che sono le parentesi tonde quelle giuste e in un ciclo for si usa il next, non il "do loop".

Per gli array vedi qui:

dove si legge:

Dim MyIntArray(10) As Integer
Dim MySingleArray(3 to 5) As Single

Vedi invece qui per i cicli.

Come vedi sono cose talmente di base che non si può prescindere dal conoscerle, di conseguenza parlare di "maggior esperienza" di queste cose è davvero fuori di luogo. Ho lavorato da anni in VB, anche se ora uso anche altri linguaggi, se vuoi rivolgerti ad altri ben venga. Volevo scriverti anche il codice completo in VB6, che sarà di una decina di righe, ma evidentemente non sei qui per chiedere aiuto o per accettare suggerimenti che, lo so, possono dare fastidio, come quello di studiare prima la documentazione.
Sergio Pappalardo aka Silver Black
https://www.silvercybertech.com
Avatar utente
Silver Black
Silver Member
Silver Member
 
Messaggi: 1148
Iscritto il: gio gen 06, 2005 8:50 pm
Località: Italia

Messaggioda Robby78 » mar set 18, 2007 10:48 am

mortal_kombat ha scritto:Grazie comunque, mi rivolgerò a gente più esperta

Ti assicuro che Silver Black non è il primo che passa.. non essere permalosa, il fatto è che dai info molto scarne, cerchiamo di chiarire un po'

Intanto usi una sintassi piuttosto strana, che linguaggio usi di preciso?
Povera patria! Schiacciata dagli abusi del potere di gente infame, che non sa cos'è il pudore - Franco Battiato
ricordati di pensare! - mia mamma
Avatar utente
Robby78
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 3829
Iscritto il: gio gen 08, 2004 5:25 pm
Località: Emilia Romagna

Messaggioda mortal_kombat » mar set 18, 2007 11:08 am

Robby78 ha scritto:
mortal_kombat ha scritto:Grazie comunque, mi rivolgerò a gente più esperta

Ti assicuro che Silver Black non è il primo che passa.. non essere permalosa, il fatto è che dai info molto scarne, cerchiamo di chiarire un po'

Intanto usi una sintassi piuttosto strana, che linguaggio usi di preciso?



Non è questione di essere permalosi, ma mi dà molta noia se qualcuno mi contraddice con arroganza su argomenti di cui ho una certa conoscenza.
Se dico che le array si definiscono con le [] e lo ripeto più volte un motivo ci sarà!
Come compilatore uso Gambas su Linux. Ho dato tutte le info necessarie, ho messo anche il codice, poi se la risposta è difficile non si deve dare la colpa a me, Silver Black non sarà il primo che passa ma nemmeno io! Non mi cimenterei in un lavoro di questo tipo se non avessi letto l'ABC, te lo assicuro!
Avatar utente
mortal_kombat
Senior Member
Senior Member
 
Messaggi: 458
Iscritto il: dom giu 24, 2007 5:36 pm
Località: Pisa

Messaggioda mortal_kombat » mar set 18, 2007 11:11 am

Silver Black ha scritto:
mortal_kombat ha scritto:1. Metto le parentesi tonde per farmi dare un bel illegal error?
2. Il do ... loop in un ciclo for non me lo avevi consigliato te ieri?
3. Ho provato a dimensionare le array prima di inizializzarle (con le parentesi []) ma mi dava lo stesso identico errore.
4. Di documentazione ne ho letta parecchia, se non vuoi darmi una mano ignora il mio messaggio ma nessuno ti autorizza a rispondermi così.

Grazie comunque, mi rivolgerò a gente più esperta


Ma che compilatore usi? Non stai usando Visual Basic? Ti assicuro che sono le parentesi tonde quelle giuste e in un ciclo for si usa il next, non il "do loop".

Per gli array vedi qui:

dove si legge:

Dim MyIntArray(10) As Integer
Dim MySingleArray(3 to 5) As Single

Vedi invece qui per i cicli.

Come vedi sono cose talmente di base che non si può prescindere dal conoscerle, di conseguenza parlare di "maggior esperienza" di queste cose è davvero fuori di luogo. Ho lavorato da anni in VB, anche se ora uso anche altri linguaggi, se vuoi rivolgerti ad altri ben venga. Volevo scriverti anche il codice completo in VB6, che sarà di una decina di righe, ma evidentemente non sei qui per chiedere aiuto o per accettare suggerimenti che, lo so, possono dare fastidio, come quello di studiare prima la documentazione.


Qui, ad esempio, invece puoi vedere che se ho definito le array così non è perché me lo sono inventato.
E poi io ho scritto:
Codice: Seleziona tutto
FOR i = 0 TO 6
   DO
      ...
      ...
      ...
   LOOP
   Inc i
NEXT


e l'ho anche indentato per chiarezza. Forse per la velocità di risposta ti è sfuggito che ho fatto proprio quello che dici.
E comunque queste polemiche non mi competono. Ti ho ringraziato per l'aiuto che mi hai dato, ti ringrazio di nuovo, ma ora vedo di andare avanti da sola.
Ultima modifica di mortal_kombat il mar set 18, 2007 11:15 am, modificato 1 volta in totale.
Avatar utente
mortal_kombat
Senior Member
Senior Member
 
Messaggi: 458
Iscritto il: dom giu 24, 2007 5:36 pm
Località: Pisa

Messaggioda Robby78 » mar set 18, 2007 11:15 am

penso che Silver (come me del resto) abbia dato per scontato che tu usassi Visual Basic di Microsoft, visto che è il più usato; per il quale valgono le regole che ti ha indicato. In ogni caso, perdonami ma sei in torto: se leggi il regolamento, vedi che avresti dovuto indicare sin dal principio l'ambiente di programmazione. Detto questo, sono sicuro che non intendesse offenderti, perciò cerchiamo di andare avanti...
Povera patria! Schiacciata dagli abusi del potere di gente infame, che non sa cos'è il pudore - Franco Battiato
ricordati di pensare! - mia mamma
Avatar utente
Robby78
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 3829
Iscritto il: gio gen 08, 2004 5:25 pm
Località: Emilia Romagna

Messaggioda Silver Black » mar set 18, 2007 11:23 am

Concordo con Robby, pensavo usassi Microsoft Visual Basic.
Ecco perché ti avevo chiesto "cosa avevi pensato" quando hai dichiarato gli array in quel modo, per capire meglio. Quello che usi tu non lo conosco per nulla, comunque lo pseudo codice che ho scritto resta valido.

Auguri per il tuo software!
Sergio Pappalardo aka Silver Black
https://www.silvercybertech.com
Avatar utente
Silver Black
Silver Member
Silver Member
 
Messaggi: 1148
Iscritto il: gio gen 06, 2005 8:50 pm
Località: Italia

Messaggioda mortal_kombat » mar set 18, 2007 11:24 am

Robby78 ha scritto:In ogni caso, perdonami ma sei in torto: se leggi il regolamento, vedi che avresti dovuto indicare sin dal principio l'ambiente di programmazione.


Indubbiamente ho sbagliato a non precisarlo perché lo davo per scontato (per voi sarà scontato VB, per me è scontato Gambas...), comunque chiedere è lecito, non c'è mica bisogno di dare degli incompetenti alla gente!
Avatar utente
mortal_kombat
Senior Member
Senior Member
 
Messaggi: 458
Iscritto il: dom giu 24, 2007 5:36 pm
Località: Pisa

Messaggioda M@ttia » mar set 18, 2007 6:07 pm

Scusa, ho letto solo la domanda e non l'intero topic, quindi magari è giâ stato scritto...


Non puo isemplicemente lavorare col codice ASCII? Generi un numero random e poi fai chr(numero) per convertirlo nel rispettivo carattere (il comando inverso si chiama asc(lettera))? Così puoi scegliere l'intervallo epr le sole minuscole, per anche le maiuscole, per i simboli, ecc. senza nessun problema [^]
</IE><FIREFOX>
Avatar utente
M@ttia
Moderatore
Moderatore
 
Messaggi: 8363
Iscritto il: lun giu 09, 2003 2:18 pm
Località: Ticino - Estero

Prossimo

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti

Powered by phpBB © 2002, 2005, 2007, 2008 phpBB Group
Traduzione Italiana phpBB.it

megalab.it: testata telematica quotidiana registrata al Tribunale di Cosenza n. 22/09 del 13.08.2009, editore Master New Media S.r.l.; © Copyright 2008 Master New Media S.r.l. a socio unico - P.I. 02947530784. GRUPPO EDIZIONI MASTER Spa Tutti i diritti sono riservati. Per la pubblicità: Master Advertising