2011-08-05 10 views
24

Me gustaría saber cómo lograr: generar un número aleatorio después de un número aleatorio de tiempo. Y reutilizarlo.Aleatorizar setInterval (Cómo reescribir el mismo al azar después de un intervalo aleatorio)

function doSomething(){ 
    // ... do something..... 
} 

var rand = 300; // initial rand time 

i = setinterval(function(){ 

    doSomething(); 
    rand = Math.round(Math.random()*(3000-500))+500; // generate new time (between 3sec and 500"s) 

}, rand); 

Y hágalo repetidamente.

Hasta ahora pude generar un intervalo aleatorio, pero fue el mismo hasta que la página se actualizó (generando un intervalo de tiempo diferente).

Gracias

Respuesta

68

Aquí es una manera muy limpia y clara para hacerlo :

http://jsfiddle.net/Akkuma/9GyyA/

function doSomething() {} 

(function loop() { 
    var rand = Math.round(Math.random() * (3000 - 500)) + 500; 
    setTimeout(function() { 
      doSomething(); 
      loop(); 
    }, rand); 
}()); 

EDITAR:

Explicación: El bucle solo existe dentro del contexto de la función invocada inmediatamente, por lo que puede llamarse recursivamente.

+0

¡perfecto! Lo amo. – Timmerz

+1

Buena solución, pero requiere algunos cambios si quiere poder eliminar el "intervalo" por un tiempo. –

+2

@toprightgamedev si desea detener el bucle, simplemente coloque una instrucción if alrededor de setTimeout con la lógica que necesita. – Akkuma

4

algo como esto debería funcionar - setTimeout() utilizar en su lugar para que pueda establecer un nuevo valor aleatorio cada vez:

function doSomething() { 
    alert("doing something"); 
} 

function init() { 
    var myFunction = function() { 
     doSomething(); 
     var rand = Math.round(Math.random() * (3000 - 500)) + 500; // generate new time (between 3sec and 500"s) 
     setTimeout(myFunction, rand); 
    } 
    myFunction(); 
} 

$(function() { 
    init(); 
}); 

Working jsFiddle here.

+0

@roXon: Sí - de esa manera puede actualizar el intervalo aleatorio cada vez – BrokenGlass

+0

Eso es jQuery al final, no es simple Javascript. – felwithe

4
intervalo

configuración Simplemente cada vez que rand (y claro que primero)

function doSomething(){ 
    // ... do something..... 
} 

var i; 
var rand = 300; 

function randomize() { 
    doSomething(); 
    rand = Math.round(Math.random()*(3000-500))+500; 
    clearInterval(i); 
    i = setInterval('randomize();', rand); 
} 

i = setInterval('randomize();', rand); 

o intente utilizar setTimeout (y establecer de nuevo después de randing)

+1

En una nota lateral, debería ser 'setInterval (randomize, rand);' –

1

sólo tirar mi sombrero en el anillo

var keepLooping = true; 
    (function ontimeout(){ 
     if(keepLooping){ 
      doTheAction(); 
      setTimeout(ontimeout, Math.random() * 100); 
     } 
    })(); 

depende si usted quiere poner doTheAction() dentro del setTimeout o no devolución de llamada. Creo que está bien ponerlo antes/afuera. Si desea la demora inicial, póngala adentro, si no, colóquela afuera para simplificar.

Cuestiones relacionadas