2011-02-02 20 views
7

Me han hecho esta pregunta, pero no he encontrado un artículo que describa un buen método. En cambio, salí con mi propio método (ver mi respuesta a continuación). Sin embargo, también es posible que simplemente haya ideado un método que no soy lo suficientemente inteligente como para romperlo. Así que les paso esta pregunta:Lanza un dado por correo electrónico

Alice y Bob desean jugar un juego de mesa por correo electrónico. Necesitan encontrar una manera de tirar los dados de una manera que no les permita engañar.

¿Cuál es un buen algoritmo para hacerlo.

+3

¿Cuál fue su respuesta? –

+1

@Justin Morgan: Él acaba de hacer la pregunta hace 2 minutos, dale un momento ... –

+0

Simplemente parecía que olvidó pegarlo, eso es todo :) –

Respuesta

4

Alice y Bob deben poder enviarse mutuamente una prueba de que eligieron un número, antes de revelar el número que eligieron. Entonces el número que eligieron debe ser verificado contra la prueba. Finalmente, ambos números deben unirse de alguna manera que no le dará a cada uno de ellos un control total sobre el resultado.

En el siguiente crypto_function puede ser algo como sha1sum o md5sum:

Paso 1:

necesario para hacer la gama de posibles valores para el crypto_function abajo suficientemente grande

  • Alice selecciona números aleatorios Ra1 y Ra2 y envíe Ra1 a Bob.
  • Bob elige los números aleatorios Rb1 y Rb2 y envía Rb1 a Alice.

Paso 2:

crea la prueba Hx que el valor Vx ahora es fijo, sino que impiden deducir este valor desde que la prueba

  • Alice elige un valor Va (0 < = Va < = 5), componga una cadena Sa="Va Ra2 Rb1", y envíe un Ha=crypto_hash(Sa) a Bob.
  • Bob escoge un valor Vb (0 < = Vb < = 5), componer una cadena de Sb="Vb Rb2 Ra1", y enviar un Hb=crypto_hash(Sb) a Alice.

Paso 3:

genera el resultado deseado V

  • Alice envía Sa a Bob. Bob Calcule Ha de Sa y compárelo con Ha desde el paso 2. Luego toma Va de Sa, y calcule el valor V=(Va+Vb)%6+1.
  • Bob envía Sb a Alice. Alice Calcule Hb de Sb y compárelo con Hb desde el paso 2. Luego toma Vb de Sb, y calcule el valor V=(Vb+Va)%6+1.

actualización:

Basado en Coin Flipping by Telephone sugerido por @Moron el algoritmo puede llegar a ser:

  1. Bob elige un número aleatorio R y el valor 0 <= Vb <= 5, calcula una hash H=crypto_hash("Vb R"), y lo envía a Alice.

  2. Alice elige el valor 0 <= Va <= 5, y se lo envía a Bob.

  3. Bob envía Vb y R a Alice; Bob calcula V=(Va+Vb)%6+1

  4. Alice verifica H=crypto_hash("Vb R"); Alice calcula V=(Va+Vb)%6+1

... Aunque me sentiría mejor acerca de si:

0. Alice elige un número aleatorio Q y lo envía a Bob.

Y la cadena a ser hash se convierte entonces en "Vb Q R".

+0

Suena como lo que hubiera hecho. aunque no creo que necesites el -2 en el cálculo final. La operación del módulo lo resuelve. Supongo que sus números aleatorios no tienen la intención de ser similares a los dados, pero eso es lo que pensé en la primera lectura, por lo que quizás quiera aclararlo. – Chris

+1

En el cálculo de 'V', parece que está utilizando supuestos sobre los rangos de' Va' y 'Vb'. ¿Puedes hacer que esos sean explícitos? –

+0

@Chriss, @jieedev, gracias. Integré tus comentarios en. –

4

Los juegos jugados por correo electrónico o no se utilizan para usar un número públicamente pseudo aleatorio, generalmente el dígito menos significativo en una lista de precios de acciones en una posición específica en una lista de acciones (no en una acción en particular) . Esto no pudo predecirse, y fue verificable después del evento. Los jugadores intercambiarían detalles, antes de la tirada de dados, de qué posición de la lista de acciones (generalmente al cierre del negocio) se debería utilizar para la siguiente tirada de dados.

+2

La versión moderna es algo así como http://www.rpglibrary.org/software/securedice/ que puede enviar rollos de dados con números de serie y un hash que se puede verificar en línea. –

+1

@justin Publique eso como una respuesta! - Los números de serie son la cuestión clave aquí –

+0

También debe resolver el problema de que un jugador al elegir * cuándo * arrojar los dados, puede elegir su 'valor'. –

0

¿Configura un servidor de terceros automatizado donde cada uno envía allí correos electrónicos para rodar los dados y reenviarlos al otro jugador?

De lo contrario, es demasiado trabajo demasiado para jugar este juego y lo dejé!

2

Alice y Bob acuerdan dos claves de sesión usando algo como Diffie-Hellman, Sa y Sb. Cada clave de sesión es la semilla de un generador de números aleatorios, Ra y Rb.

Los RNG se utilizan como almohadillas de una sola vez para cada rollo de dado. Si Alice quiere rodar, toma Ra[i] donde i es el i-ésimo número aleatorio de la secuencia. Alice envía ambos i y Ra[i] a Bob. Bob puede verificar i usando su propia copia de Ra.

Esto mantiene a Alice honesta al exigirle que use valores secuenciales de i que sean verificables por Bob.

+0

Si Bob también tiene Ra y sabe cuál es el siguiente, entonces, ¿no puede predecir el lanzamiento de los dados antes de que Alice lo envíe? Hace que el juego de 'quién tira un seis primero' un poco aburrido ... – Spacedman

+0

¿No es ese juego ya aburrido? ;) Sí, si la incertidumbre de la próxima tirada del dado es importante, entonces esta no es la solución correcta. Pero es probablemente la solución más simple en los casos en que eso no importa. –

1

Recibí una respuesta a una pregunta similar que hice ¿Cómo puedo hacer dados para R? La respuesta fue un programa para R además de un programa para "dados íntimos". No estoy seguro de en qué mueren Alice y Bob, pero sugiero usar R además de un escritorio remoto para que cada jugador pueda ver que el otro no está haciendo trampa.

No sé cómo escribir los códigos así que he copiar/pegar la respuesta que recibí:

Si desea hacer dados en el programa estadístico R. comenzar por descargar desde aquí: http://cran.r-project.org/.

para hacer una dados normales utilizan la siguiente secuencia de comandos: #Dice función rollo RollDie = function (n) muestra (1: 6, n, reemplace = T) #use Die RollDie (n)

#If you'd like to spice things up a bit and make a dice for safe and consensual adult 
#activities then use the following series of scripts: 

#Creating the function, use this script: 
#Intimate dice function 

Actions= c("kiss","lick","suck","bite", 
"spank","blow", "stroke", 
"tickle","pinch", 
"torment") 

Body= c("lips","arms","chest","thighs", 
"neck","ear", "wrist", 
"navel","nipples", 
"the good stuff") 

Action= function(n) sample(Actions[1:10],n,replace=T) 

Area= function(n) sample(Body[1:10],n,replace=T) 

Action(1) 

Area(1) 

#If you'd like the dice saved to the R global environment so you can be ready for when 
the mood is right use the following script: 

#Save the following script as yourfile.R in something like this location "C:\\Documents   
and Settings\\yourfile.R" 

#Intimate dice 
Action(1) 
Area(1) 
#yes 

#Now create the following function to save to R's global environment with the following:  

#Run all 
source("C:\\Documents and Settings\\yourfile.R",echo=T) 

hi<-function(){source("C:\\Documents and Settings\\yourfile.R",echo=T)} 

#ok 

#close and save your R workspace 
#upon opening run the following function: 
hi() 
#If this has been done properly then you should see something along the lines of this: 
#Intimate dice 
Action(1) 
[1] "bite" 

Area(1) 
[1] "ear" 

#yes 

#Here's to one more reason for celebrating math & science 
Cuestiones relacionadas