Время как определяющее значение - PullRequest
2 голосов
/ 02 февраля 2009

У меня есть фрагмент кода, который используется для определения того, должно ли произойти определенное событие. Код выглядит следующим образом.

        If (Date.Now.Ticks Mod 100) < 4 Then
            Return True
        Else
            Return False
        End If

Идея в том, что это событие должно происходить 4 раза из 100, или 4%. Тем не менее, в производстве фактически проценты варьируются от 10% до 60%. Приложение размещается на двух серверах Win2k3 с балансировкой нагрузки.

Любое предложение будет полезным.

Keith

Ответы [ 7 ]

3 голосов
/ 02 февраля 2009

Почему бы вам не использовать это:

Dim r As New Random(System.DateTime.Now.Millisecond)
Return r.Next(0, 100)
2 голосов
/ 02 февраля 2009

Причиной, по которой вы получаете такое поведение, является , вы не просите 4% времени, когда вам дается Истинное значение , вы спрашиваете, что в любое время число тиков по модулю 100 меньше 4.

При заданном генераторе случайных чисел, как в System.Random :

Dim random As New Random()
Return random.NextDouble() < 0.04

С Random.NextDouble у вас будет равная вероятность того, что будет выбрано любое число от 0,0 до 1,0. Следовательно, я могу запросить значение True 4% времени, возвращая значение true всякий раз, когда случайный дубль меньше 0,04.

1 голос
/ 02 февраля 2009

Во-первых, количество возвращенных тиков может быть масштабировано на постоянный коэффициент от любого системного таймера, из которого оно взято, так, чтобы оно не попадало в каждое целое число, а использование его в моде 100 не даст вам каждое число от 0 до 99 с равной вероятностью.

Во-вторых, если ваш код управляется событиями, система определит, когда он активирован; это время активации может иметь тенденцию быть фиксированным кратным числом тиков. Кроме того, время выполнения между активацией и выполнением вашего кода будет, как правило, одинаковым. Таким образом, в зависимости от того, что еще происходит на вашем компьютере, число тиков будет полу-предсказуемым.

В результате число тиков сильно зависит от системы; Вы хотите использовать генератор случайных чисел для получения случайных чисел ...

1 голос
/ 02 февраля 2009

Посмотрите на результаты DateTime.Now.Ticks. На моем боксе (который является Vista-боксом - здесь почти наверняка важна ОС) берут сэмплы в течение 5 секунд и получают все отличные значения, all отсчет тиков оканчивается на "91". Код для этого ниже.

Хотя явно не так плохо на вашем сервере, детальность таймера, безусловно, будет иметь существенный эффект. Использование генератора случайных чисел, безусловно, будет лучшим выбором. Помните, что вы должны создать один экземпляр Random или , возможно по одному на поток - и что Random не является потокобезопасным. Вы можете использовать мой класс StaticRandom в MiscUtil для простоты.

Вот код проверки тиков:

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;

public class Test
{
    static void Main()
    {
        foreach(long tick in GetTicks().Distinct())
        {
            Console.WriteLine(tick);
        }
    }

    static IEnumerable<long> GetTicks()
    {
        DateTime end = DateTime.Now.AddSeconds(5);
        DateTime now;
        while ((now = DateTime.Now) < end)
        {
            yield return now.Ticks;
        }
    }
}
0 голосов
/ 02 февраля 2009

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

0 голосов
/ 02 февраля 2009

Природа случайности заключается в том, что вы получаете случайные результаты. Если ваш фактический процент составляет от 10% до 60%, ваш код может работать правильно, но размеры выборки могут быть слишком малы для вероятности схождения.

0 голосов
/ 02 февраля 2009

4 раза из 100? Итак, вы хотите "Ticks Mod 25 == 0"? Кроме того, я не программист на VB, но разве вы не можете избавиться от всего этого «If - Else» и просто «Return (Date.Now.Ticks mod 25) == 0»?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...