View Full Version : [JAVA]Cambiare un valore a caso di una stringa.
neosephiroth86
25-03-2011, 07:40
Salve! Devo cambiare un valore a caso di una stringa, composta da cifre dallo 0 al 9, di un valore inferiore o maggiore del valore preesistente, tale valore sarà maggiore o minore a caso.
La dimensione del char array che rappresenta la stringa è 7 ( 8 caselle)
Ad esempio: 72839487 in input
se scelgo il terzo digit 8 posso avere o 7 o 9 (con il 50% di probabilità)
72739487 o 72939487
Nel caso il valore sia 0 o 9 (valori limite), si sostituisce tale valore con 1 nel caso dello 0 e con 8 nel caso del 9.
Ad esempio: 72039487 diventa per forza 72139487
Il codice vecchio che ho cambia il valore a caso più radicalmente, portandolo da 0 a 9.
Questo è il codice:
char_chromosome[(int) Math.round(Math.random() * 7)] = Character
.forDigit((int) Math.round(Math.random() * 9), 10);
Mi potete aiutare?
Grazie
Gin&&Tonic
25-03-2011, 07:47
scusa dimmi se ho capito bene :
Tu hai una stringa contenente un numero (intero ) e vuoi incrementare o decrementare questo num?
Nella stringa oltre al numero c'è altro?
neosephiroth86
25-03-2011, 07:52
esatto, incrementarlo o diminuirlo di uno ma a CASO.
No nella stringa non c'è altro, solo che la stringa la trasformo in un char array e poi la ritrasformo in stringa per comodità...
Gin&&Tonic
25-03-2011, 08:05
ma per "a caso cosa intendi"? tu hai parlato i evento limite (0 e 9) quindi devi controllare il valore del numero che vuoi modificare , giusto?
il tuo problema è solo quello di generare casualmente 1 o -1 ?
int GeneraN(){
int x=(int)(Math.random()*2 - Math.random()*2);
if (x==0) return GeneraN;
else return x; }
neosephiroth86
25-03-2011, 08:12
esatto, devo controllare il valore del numero che devo modificare, perchè se è 0 diventerà per forza 1 e se è 9 per forza 8
clockover
25-03-2011, 08:20
esatto, devo controllare il valore del numero che devo modificare, perchè se è 0 diventerà per forza 1 e se è 9 per forza 8
dai mica è difficile :confused: :confused:
if array[index] == '0'
cambia
else if array[index] == '9'
cambia
else
cambia
edit
ma per caso devi gestire anche un eventuale overflow?
Gin&&Tonic
25-03-2011, 08:21
QUOTO CLOCKOVER
neosephiroth86
25-03-2011, 13:05
ok ci siamo ma per mettere un valore casuale tra -1 e +1?
Gin&&Tonic
25-03-2011, 13:42
Nel main:
boolean controllo=true;
while(controllo)
int x=(int)(Math.random()*2 - Math.random()*2);
if (x!=0) controllo =false;
}
int numeroCasuale=x;
se vuoi un metodo va bee quello che ti ho consigliato prima
neosephiroth86
25-03-2011, 13:44
ok grazie perfetto!
Gin&&Tonic
25-03-2011, 13:47
ok grazie perfetto!
Nulla:D
ma per "a caso cosa intendi"? tu hai parlato i evento limite (0 e 9) quindi devi controllare il valore del numero che vuoi modificare , giusto?
il tuo problema è solo quello di generare casualmente 1 o -1 ?
int GeneraN(){
int x=(int)(Math.random()*2 - Math.random()*2);
if (x==0) return GeneraN;
else return x; }
Forse è meglio fare una cosa del genere:
int Genera()
{
double val = Math.random();
return val < 0.5 ? -1 : 1;
}
neosephiroth86
25-03-2011, 17:12
public class test {
public static void main(String args[]){
String chromosome="03827593";
char[] char_chromosome = chromosome.toCharArray();
System.out.println(chromosome+" vecchio ---------");
int pos=(int) Math.round(Math.random() * 7);
int x=(int)(Math.random()*2 - Math.random()*2);
if (char_chromosome[pos]==0) char_chromosome[pos]=1;
if (char_chromosome[pos]==9) char_chromosome[pos]=8;
else{
char_chromosome[pos]=(char) (char_chromosome[pos]+x);
}
String new_chromosome = new String(char_chromosome);
chromosome = new_chromosome;
System.out.println(chromosome+" nuovo -------------");
}
}
Mi da come output
03827593 vecchio ---------
03827593 nuovo -------------
Lo stesso! Dove sbaglio?
clockover
25-03-2011, 17:37
Fai molta ma molta confusione
creati un nuovo oggetto Random
Random rn = new Random();
adesso passiamo alla posizione casuale
//posizione casuale dell'array
int pos = rn.nexInt(array.lenght);
qui fai i cambiamenti
con questo verifichi i valori
if(array[index] == '0')
cambi il valore
else if array[index] == '9')
cambi il valore
else
//qui utilizzi il metodo suggerito da WarDuck
array[index] += generaN();
e hai fatto
edit
utilizzo Random perchè mi ci trovo meglio... niente di particolare però
neosephiroth86
25-03-2011, 18:19
un errore sta nel codice di gin e tonic
int x=(int)(Math.random()*2 - Math.random()*2)
dà a volte -1, 0 e +1, non solo -1 e +1
Infatti il codice mio va bene quando compare +1 e -1, ridà lo stesso valore di input quando x è 0 (come m'è capitato quando mi sono lamentato).
neosephiroth86
25-03-2011, 18:28
do{x=(int)(Math.random()*2 - Math.random()*2);}
while(x==0);
Adesso da SOLO -1 e +1
Don[ITA]
25-03-2011, 19:02
Ma scusa...fare qualcosa tipo:
public String modifica(String s) {
int i = (int)(Math.random() * s.length());
char[] c = s.toCharArray();
if(c[i] == '0') c[i] = '1';
else if(c[i] == '9') c[i] = '8';
else c[i] += Math.random() > 0.5 ? 1 : -1;
return new String(c);
}
?
cya
Mi chiedo perché non leggiate i reply, post 12 (http://www.hwupgrade.it/forum/showpost.php?p=34780127&postcount=12):
Forse è meglio fare una cosa del genere:
int Genera()
{
double val = Math.random();
return val < 0.5 ? -1 : 1;
}
neosephiroth86
25-03-2011, 19:35
lo sò solo val < 0.5 ? -1 : 1;
per me è arabo...
Sono stato istruito alla java 1.4, mai vista una cosa del genere "?" e" :"...
lo sò solo val < 0.5 ? -1 : 1;
per me è arabo...
Sono stato istruito alla java 1.4, mai vista una cosa del genere "?" e" :"...
return val < 0.5 ? 1 : -1;
sarebbe equivalente a:
if (val < 0.5) return 1;
else return -1;
Gin&&Tonic
26-03-2011, 09:21
un errore sta nel codice di gin e tonic
int x=(int)(Math.random()*2 - Math.random()*2)
dà a volte -1, 0 e +1, non solo -1 e +1
Infatti il codice mio va bene quando compare +1 e -1, ridà lo stesso valore di input quando x è 0 (come m'è capitato quando mi sono lamentato).
:O Si può sapere dove sta l'errore? guarda che nel metodo GeneraN che ti ho inviato io c'è un " if(x==0) return GeneraN "
dove GeneraN credevo l'avessi capito è un metodo ricorsivo ed il suo caso base è appunto un numero che non sia 0 ( cioè 1 o -1).
Comunque credo che la soluzione consigliata da WarDuck, sia migliore.
neosephiroth86
04-09-2011, 15:33
ciao ragazzi ho realizzato una classe di test per provare la cosa ma non va bene per i valori estremi come i vettori 99999999 o 00000000, in pratica in output ci sono delle posizioni mancanti..
es: input 99999999
output 899 998
Mi potete dare una mano?
Grazie
public class main {
static String chromosome = "00000000";
public static void main (String args[])
{
char[] char_chromosome = chromosome.toCharArray();
for (int i = 0; i < chromosome.length(); i++) {
int selection = (int) Math.round(Math.random() * 10);
if (char_chromosome[i] == 9) {
if (selection < 5) {
char_chromosome[i] = 8;
}
}
else {
if (char_chromosome[i] == 0) {
if (selection > 5) {
char_chromosome[i] = 1;
}
}
else {
if (selection < 4) {
int minor = Integer.parseInt(Character
.toString(char_chromosome[i])) - 1;
char_chromosome[i] = Character.forDigit(minor, 10);
}
if (selection > 7) {
int superior = Integer.parseInt(Character
.toString(char_chromosome[i])) + 1;
char_chromosome[i] = Character.forDigit(superior, 10);
}
}
}
}
String new_chromosome = new String(char_chromosome);
chromosome = new_chromosome;
System.out.println(chromosome+" IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII");
}
}
Perché stai usando un array di char, i char si indicano con le ' , ad es '1'.
neosephiroth86
05-09-2011, 07:39
perchè mi trovo in un framework ad agenti, dove per scambiare info tra i vari agenti devo usare le stringhe, non posso passare interi
neosephiroth86
05-09-2011, 10:00
comunque il codice sopra è direttamente eseguibile, basta creare una semplice classe...
Mi sapete dire perchè a volte funziona e altre no???
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.