/**
* Temps de sortie d'un carr� pour un point partant de son centre et se d�pla�ant al�atoirement
* @author Jean-Franc.Kentzel@ac-toulouse.fr
*/
import javax.swing. *;
void main() {
// Param�tres :
double p = 0.25;
// P(part � droite)
double q = 0.25;
// P(part � gauche)
double s = 0.25;
// P(part enhaut)
double w = 0.25;
//P(part en bas)
// on remet tout en blanc :
for (int u = 0; u < 32; u ++) {
for (int v = 0; v < 32; v ++)setPixel(u, v, 15);
}
//
JFrame cadre1 = new JFrame();
JTextPane texte1 = new JTextPane();
String str1 = "Un point part du centre d'un carr� et se d�place al�atoirement (par d�faut : uniform�ment dans les quatre directions).";
texte1.setText(str1);
cadre1.add(texte1);
cadre1.setSize(200, 150);
cadre1.setLocation(100, 200);
cadre1.setVisible(true);
sleep(4000);
//
int t = readInteger("Donnez svp la taille du carr� : un nombre impair entre 1 et 29");
while (t % 2 == 0 || t > 29 || t < 1) t = readInteger("On vous a dit ''IMPAIR'', ''SUPERIEUR A 0 ET INFERIEUR STRICT A 31'' !! Vous �tes sourd (e)?");
//
cadre1.setVisible(true);
//
JFrame cadre11 = new JFrame();
JTextPane texte11 = new JTextPane();
String str11 = " On simule (15 fois) le ''temps'' qu'il met pour sortir du carr�. A partir de la cinqui�me simulation on acc�l�re.";
texte11.setText(str11);
cadre11.add(texte11);
cadre11.setSize(200, 200);
cadre11.setLocation(100, 350);
cadre11.setVisible(true);
sleep(1000);
//
int nnn = 0;
//c'est le temps de la simulation 1.
int rand;
int x;
int y;
// on fait le cadre (en noir):
for (int u = 0; u < 32; u ++) {
for (int v = 0; v < 32; v ++) {
if (u < 15 - (t - 1) / 2 || v < 15 - (t - 1) / 2 || u > 15 + (t - 1) / 2 || v > 15 + (t - 1) / 2) setPixel(u, v, 0);
}
}
for (int c = 0; c < 15; c ++)// on essaie chacune des 15 couleurs
{
x = 15;
y = 15;
setPixel(x, y, c);
sleep(300);
for (int i = 1; i < 5000; i ++) // on fait 5000 pas au maximum
{
setPixel(x, y, 15);
// cette ligne peut �tre enlev�e, on a alors des "surfaces"
// (il suffit de mettre // au d�but de la ligne)
//
rand = random(1, 101);
if (rand >= 1 && rand <= 100 * p)x = x + 1;
if (rand > 100 * p && rand <= 100 * (p + q))x = x - 1;
if (rand > 100 * (p + q) && rand <= 100 * (p + q + s))y = y + 1;
if (rand > 100 * (p + q + s))y = y - 1;
setPixel(x, y, c);
if (c < 2)sleep(6);
if (c < 4)sleep(6);
else sleep(1);
if (x == 15 - (t - 1) / 2 - 1 || x == 15 + (t - 1) / 2 + 1 || y == 15 - (t - 1) / 2 - 1 || y == 15 + (t - 1) / 2 + 1) {
if (c == 0) {
setPixel(x, y, 3);
// sinon c'est noir sur noir et on ne voit pas le point arriv�.
sleep(100);
}
JFrame f = new JFrame("''temps'' = " + i);
f.setVisible(true);
f.setSize(200, 60);
f.setLocation(500, 20 + 30 * c);
nnn = nnn + i;
// on fait le total des coups
break;
// }
}
}
sleep(10);
}
double moy = (double)nnn / 15;
//
JFrame cadre2 = new JFrame();
JTextPane texte2 = new JTextPane();
String str2 = " Avec ces 15 essais, pour un carr� de c�t� " + t + ", en moyenne il a fallu " + moy + " coups pour sortir du carr�. On refait 150 essais � donf pour v�rifier.";
texte2.setText(str2);
cadre2.add(texte2);
cadre2.setSize(200, 150);
cadre2.setLocation(300, 100);
cadre2.setVisible(true);
//
sleep(1000);
//
//
// on remet tout en blanc :
for (int u = 0; u < 32; u ++) {
for (int v = 0; v < 32; v ++)setPixel(u, v, 15);
}
// on refait le cadre :
for (int u = 0; u < 32; u ++) {
for (int v = 0; v < 32; v ++) {
if (u < 15 - (t - 1) / 2 || v < 15 - (t - 1) / 2 || u > 15 + (t - 1) / 2 || v > 15 + (t - 1) / 2) setPixel(u, v, 0);
}
}
int min = 500;
int max = 0;
//initialisation des min et max des 200 essais � venir
nnn = 0;
int[]tab_x = new int[200];
int[]tab_y = new int[200];
for (int z = 0; z < 200; z ++) {
tab_x[z] = 15;
tab_y[z] = 15;
}
for (int i = 1; i < 5000; i ++)// on fait 5000 pas au maximum
{
// on d�marre d = chacun des 150 nouveaux trajets
for (int d = 0; d < 150; d ++) {
if (tab_x[d] > 15 - (t - 1) / 2 - 1 && tab_x[d] < 15 + (t - 1) / 2 + 1 && tab_y[d] > 15 - (t - 1) / 2 - 1 && tab_y[d] < 15 + (t - 1) / 2 + 1) {
setPixel(tab_x[d], tab_y[d], 15);
//
rand = random(1, 101);
if (rand >= 1 && rand <= 100 * p) tab_x[d] = tab_x[d] + 1;
if (rand > 100 * p && rand <= 100 * (p + q)) tab_x[d] = tab_x[d] - 1;
if (rand > 100 * (p + q) && rand <= 100 * (p + q + s)) tab_y[d] = tab_y[d] + 1;
if (rand > 100 * (p + q + s)) tab_y[d] = tab_y[d] - 1;
setPixel(tab_x[d], tab_y[d], d % 16);
sleep(1);
if (tab_x[d] == 15 - (t - 1) / 2 - 1 || tab_x[d] == 15 + (t - 1) / 2 + 1 || tab_y[d] == 15 - (t - 1) / 2 - 1 || tab_y[d] == 15 + (t - 1) / 2 + 1) {
if (d % 16 == 0)setPixel(tab_x[d], tab_y[d], 3);
if (i > max)max = i;
if (i < min)min = i;
nnn = nnn + i;
// on refait le total des coups
}
}
}
for (int d = 0; d < 150; d ++) {
if (tab_x[d] == 15 - (t - 1) / 2 - 1 || tab_x[d] == 15 + (t - 1) / 2 + 1 || tab_y[d] == 15 - (t - 1) / 2 - 1 || tab_y[d] == 15 + (t - 1) / 2 + 1) break;
}
}
moy = (double)nnn / 150;
sleep(1000);
//
JFrame cadre3 = new JFrame();
JTextPane texte3 = new JTextPane();
String str3 = "Avec ces 150 nouveaux essais, en moyenne il a fallu " + moy + " coups pour sortir du carr�, avec un min de " + min + " et un max de " + max + ".";
texte3.setText(str3);
cadre3.add(texte3);
cadre3.setSize(200, 150);
cadre3.setLocation(300, 250);
cadre3.setVisible(true);
//
//
// Calculs de probas
//
double lim = 0.005;
if (t < 10) lim = 0.02;
if (t > 20)lim = 0.001;
// lim est la limite inf de probas pour l'affichage de la fen�tre 4
JFrame cadre4 = new JFrame();
JTextPane texte4 = new JTextPane();
String str4 = " On donne sur la console la loi du temps de sortie pour ce carr� de c�t� " + t + " (probas > " + lim + ") et, tout en bas si le carr� est grand, l'esp�rance de ce temps de sortie pour les autres tailles de carr�s. Cette esp�rance n�glige les ''temps'' de sortie > 5000, c'est � dire une probabilit� < 10^(-10).";
texte4.setText(str4);
cadre4.add(texte4);
cadre4.setSize(200, 200);
cadre4.setLocation(300, 400);
cadre4.setVisible(true);
double [][][] val = new double[5000][61][61];
// val [n][k][m]=P(X_n = k-r && Y_n = m-r)
double [] proba = new double [5000];
// proba[n] est la proba de sortie du carr� au (n+1)_�me coup
for (int nn = 0; nn < 5000; nn ++) proba [nn] = 0;
double[]Esperance = new double [15];
// Esperance[r] est le temps moyen de sortie si t=2*r+1.
//
//initialisations :
double S = 0;
//somme sur kk et mm, pour n donn� des P(X_n=kk && Y_n = mm)
double Somme = 0;
//somme sur n<5000 des P(sortie au temps n), utile pour des v�rifications
for (int r = 1; r < 15; r ++) {
val[0][r][r] = 1;
val[0][r - 1][r - 1] = 0;
Somme = 0;
S = 0;
Esperance[r] = 0;
//
for (int dd = - r; dd < r + 1; dd ++) {
for (int ee = - r; ee < r + 1; ee ++) {
int d = dd + r;
int e = ee + r;
for (int nn = 1; nn < 5000; nn ++) val[nn][d][e] = 0;
}
}
//
// d�but de la r�currence en n :
for (int n = 1; n < 5000; n ++) {
proba[n] = 0;
S = 0;
for (int kk = - r; kk < r + 1; kk ++) {
int k = kk + r;
//k est entre 0 et 2r. C'est un index de tableau donc il doit �tre positif .
for (int mm =- r; mm < r + 1; mm ++) {
int m = mm + r;
//m est entre 0 et 2r. C'est un index (positif ) de tableau.
//
// P(X_n=kk && Y_n = mm)=val [n][kk+r][mm+r]=val [n][k][m]
//
if (kk >- r && kk < r && mm >- r && mm < r) val[n][k][m] = val[n - 1][k - 1][m] * p + val[n - 1][k + 1][m] * q + val[n - 1][k][m - 1] * s + val[n - 1][k][m + 1] * w;
//
if (kk == r) {
if (m > 0)val[n][k][m] = val[n - 1][k - 1][m] * p + val[n - 1][k][m + 1] * w + val[n - 1][k][m - 1] * s;
else val[n][k][m] = val[n - 1][k - 1][m] * p + val[n - 1][k][m + 1] * w;
proba[n] = proba[n] + val[n][k][m] * p;
}
//
if (kk ==- r) {
if (m > 0) val[n][k][m] = val[n - 1][k + 1][m] * q + val[n - 1][k][m + 1] * w + val[n - 1][k][m - 1] * s;
else val[n][k][m] = val[n - 1][k + 1][m] * q + val[n - 1][k][m + 1] * w;
proba[n] = proba[n] + val[n][k][m] * q;
}
//
if (mm == r) {
if (k > 0) val[n][k][m] = val[n - 1][k - 1][m] * p + val[n - 1][k + 1][m] * q + val[n - 1][k][m - 1] * s;
else val[n][k][m] = val[n - 1][k + 1][m] * q + val[n - 1][k][m - 1] * s;
proba[n] = proba[n] + val[n][k][m] * s;
}
//
if (mm ==- r) {
if (k > 0) val[n][k][m] = val[n - 1][k - 1][m] * p + val[n - 1][k + 1][m] * q + val[n - 1][k][m + 1] * w;
else val[n][k][m] = val[n - 1][k + 1][m] * q + val[n - 1][k][m + 1] * w;
proba[n] = proba[n] + val[n][k][m] * w;
}
if (val[n][k][m] != 0) {
S = S + val[n][k][m];
// Bon, on comprend que certains pr�f�rent les matrices !
}
}
}
Somme = Somme + proba[n];
Esperance[r] = Esperance[r] + (n + 1) * proba[n];
for (int a = 1; a < 1000; a ++) {
if (a == 1 && n == 1 && t == 2 * r + 1) {
println("Les probas d�passant " + lim + ": (le r�glage de ce seuil pourrait �tre am�lior�...!)");
println("(quand le carr� grandit, il y a une assez grande plage sur laquelle on a une loi presque uniforme)");
}
if (t == 2 * r + 1 && n == a && proba[a] > lim) {
println("La probabilit� de sortie au temps " + (a + 1) + " est " + proba[a] + ".");
}
}
}
}
println("");
println(" Pour les autres valeurs de r :");
println("Si le c�t� vaut 1, l'esp�rance du temps de sortie est...1.");
for (int b = 1; b < 15; b ++) println(" Si le c�t� vaut " + (2 * b + 1) + ", l'esp�rance du temps de sortie est " + Esperance[b] + ".");
println("");
println(" Il semble que c'est avec une loi uniforme(4 fois 1/4} que");
println("l'esp�rance (= la moyenne) du temps de sortie est la plus �lev�e.");
}