Aquí está el árbol de probabilidad completo para estos reemplazos.
Supongamos que comienza con la secuencia 123, y luego enumeraremos todas las formas de producir resultados aleatorios con el código en cuestión.
123
+- 123 - swap 1 and 1 (these are positions,
| +- 213 - swap 2 and 1 not numbers)
| | +- 312 - swap 3 and 1
| | +- 231 - swap 3 and 2
| | +- 213 - swap 3 and 3
| +- 123 - swap 2 and 2
| | +- 321 - swap 3 and 1
| | +- 132 - swap 3 and 2
| | +- 123 - swap 3 and 3
| +- 132 - swap 2 and 3
| +- 231 - swap 3 and 1
| +- 123 - swap 3 and 2
| +- 132 - swap 3 and 3
+- 213 - swap 1 and 2
| +- 123 - swap 2 and 1
| | +- 321 - swap 3 and 1
| | +- 132 - swap 3 and 2
| | +- 123 - swap 3 and 3
| +- 213 - swap 2 and 2
| | +- 312 - swap 3 and 1
| | +- 231 - swap 3 and 2
| | +- 213 - swap 3 and 3
| +- 231 - swap 2 and 3
| +- 132 - swap 3 and 1
| +- 213 - swap 3 and 2
| +- 231 - swap 3 and 3
+- 321 - swap 1 and 3
+- 231 - swap 2 and 1
| +- 132 - swap 3 and 1
| +- 213 - swap 3 and 2
| +- 231 - swap 3 and 3
+- 321 - swap 2 and 2
| +- 123 - swap 3 and 1
| +- 312 - swap 3 and 2
| +- 321 - swap 3 and 3
+- 312 - swap 2 and 3
+- 213 - swap 3 and 1
+- 321 - swap 3 and 2
+- 312 - swap 3 and 3
Ahora, la cuarta columna de números, el que contempla el intercambio de información, contiene el resultado final, con 27 resultados posibles.
Vamos a contar el número de veces que ocurre cada patrón:
123 - 4 times
132 - 5 times
213 - 5 times
231 - 5 times
312 - 4 times
321 - 4 times
=============
27 times total
Si ejecuta el código que intercambia de forma aleatoria para un número infinito de veces, los patrones 132, 213 y 231 se producirán con más frecuencia que los patrones 123, 312 y 321, simplemente porque la forma en que el código cambia hace que sea más probable que ocurra.
Ahora, por supuesto, puede decir que si ejecuta el código 30 veces (27 + 3), podría terminar con todos los patrones 5 veces, pero cuando se trata de estadísticas hay que mirar el largo tendencia de término
Aquí es código C# que explora la aleatoriedad para uno de cada patrón sea posible:
class Program
{
static void Main(string[] args)
{
Dictionary<String, Int32> occurances = new Dictionary<String, Int32>
{
{ "123", 0 },
{ "132", 0 },
{ "213", 0 },
{ "231", 0 },
{ "312", 0 },
{ "321", 0 }
};
Char[] digits = new[] { '1', '2', '3' };
Func<Char[], Int32, Int32, Char[]> swap = delegate(Char[] input, Int32 pos1, Int32 pos2)
{
Char[] result = new Char[] { input[0], input[1], input[2] };
Char temp = result[pos1];
result[pos1] = result[pos2];
result[pos2] = temp;
return result;
};
for (Int32 index1 = 0; index1 < 3; index1++)
{
Char[] level1 = swap(digits, 0, index1);
for (Int32 index2 = 0; index2 < 3; index2++)
{
Char[] level2 = swap(level1, 1, index2);
for (Int32 index3 = 0; index3 < 3; index3++)
{
Char[] level3 = swap(level2, 2, index3);
String output = new String(level3);
occurances[output]++;
}
}
}
foreach (var kvp in occurances)
{
Console.Out.WriteLine(kvp.Key + ": " + kvp.Value);
}
}
}
Este salidas:
123: 4
132: 5
213: 5
231: 5
312: 4
321: 4
Así, mientras que esta respuesta en el recuento de hecho, no es una respuesta puramente matemática , solo tiene que evaluar todas las formas posibles en que puede funcionar la función aleatoria y observar los resultados finales.
¿Por qué está pidiendo una "respuesta no matemática" (en los comentarios a continuación) cuando los algoritmos se explican por las matemáticas? – ephemient
El segundo error también: nunca puede producir el primer elemento en la primera posición y, por lo tanto, está sesgado. Necesita hacer $ j = rand ($ i, 51). Además, falta un punto y coma. – Svante
Para ver un ejemplo de una mezcla que no tiene este problema, http://stackoverflow.com/a/23292532/57695 es decir, comienza en un extremo y una vez que seleccionas un elemento aleatorio, no los toques así que el número de los elementos para seleccionar se vuelven cada vez más pequeños. –