PDA

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

WarDuck
25-03-2011, 13:54
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

WarDuck
25-03-2011, 19:26
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" :"...

asrm
26-03-2011, 00:50
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");



}



}

asrm
04-09-2011, 21:39
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???