Как генерировать случайные числа с заданными временными интервалами?

Я разработал код в Java для генерации десяти случайных чисел из диапазона от 0 до 99. Проблема в том, что мне нужно генерировать случайное число каждые 2 минуты. Я новичок в этой области и нуждаюсь в ваших взглядах.

Ответ 1

Этот пример добавляет случайное число к блокировке dequeue каждые две минуты. Вы можете взять номера из очереди, когда они вам понадобятся. Вы можете использовать java.util.Timer как облегченное средство для планирования генерации чисел, или вы можете использовать java.util.concurrent.ScheduledExecutorService для более универсального решения, если вам нужно больше утонченности в будущем. Записывая номера в dequeue, у вас есть единый интерфейс для извлечения чисел из обоих объектов.

Сначала мы настраиваем очередь блокировки:

final BlockingDequeue<Integer> queue = new LinkedBlockingDequeue<Integer>();

Вот настройка с помощью java.utilTimer:

TimerTask task = new TimerTask() {
    public void run() {
        queue.put(Math.round(Math.random() * 99));
        // or use whatever method you chose to generate the number...
    }
};
Timer timer = new Timer(true)Timer();
timer.schedule(task, 0, 120000); 

Это настройка с помощью java.util.concurrent.ScheduledExecutorService

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Runnable task = new Runnable() {
    public void run() {
        queue.put(Math.round(Math.random() * 99));
        // or use whatever method you chose to generate the number...
    }
};
scheduler.scheduleAtFixedRate(task, 0, 120, SECONDS);

Теперь вы можете получить новое случайное число из очереди каждые две минуты. Очередь будет заблокирована до тех пор, пока не появится новый номер...

int numbers = 100;
for (int i = 0; i < numbers; i++) {
    Inetger rand = queue.remove();
    System.out.println("new random number: " + rand);
}

Как только вы закончите, вы можете завершить планировщик. Если вы использовали таймер, просто сделайте

timer.cancel();

Если вы использовали ScheduledExecutorService, вы можете сделать

scheduler.shutdown();

Ответ 2

У вас есть два требования, которые не связаны:

  • Генерация случайных чисел
  • Выполнять задачу каждые 2 минуты.

Чтобы делать что-либо каждые 2 минуты, вы можете использовать ScheduledExecutorService.

Ответ 3

Вы можете планировать запуск вашей программы каждые две минуты, используя любые функции планирования в вашей целевой среде (например, cron, at, запланированные задачи Windows и т.д.).

Или вы можете использовать метод Thread#sleep, чтобы приостановить ваше приложение на 2000 мс и запустить код в цикле:

while (loopCondition) {
    /* ...generate random number... */

    // Suspend execution for 2 minutes
    Thread.currentThread().sleep(1000 * 60 * 2);
}

(Это просто пример кода, вам нужно обработать InterruptedException и т.д.)

Ответ 4

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.Timer;

public class TimerExample {
    Random rand = new Random();
    static int currRand;

    TimerExample() {
        currRand = rand.nextInt(99);
        ActionListener actionListener = new ActionListener() {
            public void actionPerformed(ActionEvent actionEvent) {
                currRand = rand.nextInt(99);
            }
        };
        Timer timer = new Timer(2000, actionListener);
        timer.start();
    }

    public static void main(String args[]) throws InterruptedException {
        TimerExample te = new TimerExample();
        while( true ) {
            Thread.currentThread().sleep(500);
            System.out.println("current value:" + currRand );
        }
    }
}

EDIT: Конечно, вы должны установить 2000 в новый таймер (2000, actionListener); до 120 000 в течение двух минут.

Ответ 5

Я не совсем уверен, что понимаю проблему. Если вы хотите генерировать разные случайные числа каждые две минуты, просто вызовите функцию rnd каждые две минуты.

Это может быть так просто, как что-то вроде (псевдокод):

n = rnd()
repeat until finished:
    use n for something
    sleep for two minutes
    n = rnd()

Если вы хотите использовать одно и то же случайное число в течение двух минут и создать новый:

time t = 0
int n = 0

def sort_of_rnd():
    if now() - t > two minutes:
        n = rnd()
        t = now()
    return n

который будет продолжать возвращать тот же номер в течение двух минут.