Вход/Регистрация
Программирование на языке Ruby
вернуться

Фултон Хэл

Шрифт:
Листинг 18.5. Генератор случайных чисел с буферизацией

require "net/http"

require "thread"

class TrueRandom

 def initialize(min=nil,max=nil,buff=nil,slack=nil)

@buffer = []

@site = "www.random.org"

if ! defined? @init_flag

# Принять умолчания, если они не были заданы явно И

# это первый созданный экземпляр класса...

@min = min || 0

@max = max || 1

@bufsize = buff || 1000

@slacksize = slack || 300

@mutex = Mutex.new

@thread = Thread.new { fillbuffer }

@init_flag = TRUE # Значение может быть любым.

else

@min = min || @min

@max = max || @max

@bufsize = buff || @bufsize

@slacksize = slack || @slacksize

end

@url = "/cgi-bin/randnum" +

"?num=#@bufsize&min=#@min&max=#@max&col=1"

 end

 def fillbuffer

h = Net::HTTP.new(@site, 80)

resp, data = h.get(@url, nil)

@buffer += data.split

 end

 def rand

num = nil

@mutex.synchronize { num = @buffer.shift }

if @buffer.size < @slacksize

if ! @thread.alive?

@thread = Thread.new { fillbuffer }

end

end

if num == nil

if @thread.alive?

@thread.join

else

@thread = Thread.new { fillbuffer }

@thread.join

end

@mutex.synchronize { num = @buffer.shift }

end

num.to_i

 end

end

t = TrueRandom.new(1,6,1000,300)

count = {1=>0, 2=>0, 3=>0, 4=>0, 5=>0, 6=>0}

10000.times do |n|

 x = t.rand

 count[x] += 1

end

p count

# При одном прогоне:

# {4=>1692, 5=>1677, 1=>1678, 6=>1635, 2=>1626, 3=>1692}

18.2.2. Запрос к официальному серверу времени

Как мы и обещали, приведем программу для обращения к NTP-серверу в сети (NTP — Network Time Protocol (синхронизирующий сетевой протокол). Показанный ниже код заимствован с небольшой переработкой у Дэйва Томаса.

require "net/telnet"

timeserver = "www.fakedomain.org"

local = Time.now.strftime("%H:%M:%S")

tn = Net::Telnet.new("Host" => timeserver,

 "Port" => "time",

 "Timeout" => 60,

 "Telnetmode" => false)

msg = tn.recv(4).unpack('N')[0]

# Преобразовать смещение от точки отсчета

remote = Time.at(msg — 2208988800).strftime("%H:%M:%S")

puts "Местное : #{local}"

puts "Удаленное : #{remote}"

Мы устанавливаем соединение и получаем четыре байта. Они представляют 32-разрядное число в сетевом (тупоконечном) порядке байтов. Это число преобразуется в понятную форму, а затем — из смещения от точки отсчета в объект

Time
.

Мы не указали имя реального сервера. Дело в том, что его полезность часто зависит от того, где вы находитесь. Кроме того, многие серверы ограничивают доступ, так что для запроса вы должны получить разрешение или хотя бы уведомить владельца. Поисковая машина поможет найти открытый NTP-сервер в радиусе 1000 км от вас.

  • Читать дальше
  • 1
  • ...
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: