Iniziamo dalla parte che si occupa di settare 3 elementi casuali di life ad 1. Innanzitutto le variabili casuale1, casuale2, casuale3 sono inutili, infatti come già ti è stato detto basta utilizzare un semplice ciclo for. Quello che devi fare è generare un numero casuale (chiamiamolo r) compreso nell'intervallo [0;N) (e non [0;MAX)), controllare se l'elemento life[r] è uguale a 0 e in tal caso settarlo a 1.
Per quanto riguarda la dimensione dell'array population (che come già detto più volte è completamente inutile), se ci rifletti bene non è data da MAX... in pratica la popolazione (ossia il numero di 1) viene calcolata ad ogni generazione di newlife, quindi l'array population deve avere una dimensione pari al numero di volte in cui viene generato newlife.
Perchè due for distinti per calcolare min e max?
Veniamo ora al cuore del programma, ossia la parte che si occupa di generare newlife. Piccolo spoiler... è completamente sbagliata!
Consideriamo il seguente frammento
if ((j) == (N-1))
{
life[j+1] = life[0];
}
Se j==N-1 ==> j+1=N-1+1=N ==> che andrai a scrivere in life[N], che è un settore di memoria che non compete all'array.
Consideriamo il seguente frammento
else if ((j) == (0))
{
life[j-1] = life[N-1];
}
Se j==0 ==> j-1=0-1=-1 ==> che andrai a scrivere in life[-1], che non ha proprio senso.
Consideriamo il seguente frammento
if((life[j+1] && life[j-1])==1)
{
newlife[j]=0;
}
è corretto, ma temo che si tratti di una fortunata coincidenza! In pratica la condizione che hai scritto non controlla che life[j+1] e life[j-1] siano entrambi 1, ma controlla che siano entrambi diversi da 0. In pratica volendo dilungarsi la suddetta condizione può essere riscritta come
if((life[j+1] != 0 && life[j-1] != 0) == true)
volendo invece essere più concisi
if(life[j+1] && life[j-1])
Consideriamo il seguente frammento
if ((life[j+1] || life[j-1])==1)
{
temp = newlife[j];
newlife[j]=temp + 1;
}
innanzitutto da un punto di vista logico, affinché la cosa funzioni dovresti sostituire l'if con un ifelse, altrimenti se sarà vero l'if precedente lo sarà per forza di cose anche questo. Quell'utilizzo di temp non ha alcun senso in quanto le istruzioni
temp = newlife[j];
newlife[j]=temp + 1;
coincidono con
newlife[j]++;
In ogni caso stando alla traccia qui ci troviamo nel caso in cui life[j] ha il valore 1 o solo a destra o solo a sinistra, quindi all'interno dell'ifelse andrebbe messo
if(life[j]==0)
{
newlife[j]=1;
}
else
{
newlife[j]=0;
}
o molto più semplicemente, sfruttando l'algebra booleana
newlife[j]=!life[j];
Non vado oltre in quest'analisi dettagliata del codice, ma spero che tu riesca da solo a trovare glia altri errori.
Ti riporto infine un frammento di un mio post nel topic della roulette:
- innanzitutto al fine di rendere il codice più chiaro e leggibile, ti consiglio di rispettare la spaziatura e l'indentazione e di scrivere una sola istruzione per riga;
- ti conviene ripassare un po' la precedenza fra gli operatori in modo da evitare di mettere parentesi tonde lì dove non servono;