Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Время между кликами


Автор: PsiMagistr 3.5.2020, 12:32
Ребята,

Как правильно рассчитать время между кликами мыши в миллисекундах в C#? Если набегают секунды, они должны переводиться в миллисекунды.

Автор: THandle 4.5.2020, 01:06
Привет.

Ну смотри, у тебя есть какая-то переменная, допустим previousDate типа DateTime, в ней ты хранишь время предыдущего клика.
Тогда в обработчике клика можно написать что-то вроде:

Код

            // Получаем текущую дату/время
            DateTime now = DateTime.Now;
            // Вычисляем разницу времени между датой предыдущего клика и текущего
            TimeSpan difference = now.Subtract(previousDate);
            // Теперь обновляем время предыдущего клика
            previousDate = now;


Соответственно разница у тебя будет храниться в переменной difference типа TimeSpan. Чтобы выразить эту разницу в миллисекундах, тебе нужно свойство difference.TotalMilliseconds.

Думаю, как-то так)

Автор: PsiMagistr 4.5.2020, 08:47
Цитата(THandle @ 4.5.2020,  01:06)
Привет.

Ну смотри, у тебя есть какая-то переменная, допустим previousDate типа DateTime, в ней ты хранишь время предыдущего клика.
Тогда в обработчике клика можно написать что-то вроде:

Код

            // Получаем текущую дату/время
            DateTime now = DateTime.Now;
            // Вычисляем разницу времени между датой предыдущего клика и текущего
            TimeSpan difference = now.Subtract(previousDate);
            // Теперь обновляем время предыдущего клика
            previousDate = now;


Соответственно разница у тебя будет храниться в переменной difference типа TimeSpan. Чтобы выразить эту разницу в миллисекундах, тебе нужно свойство difference.TotalMilliseconds.

Думаю, как-то так)

Спасибо большое за помощь!

При попытке вывести это тотальные миллисекунды в строку получаю нечто вроде:

544,2344.

Как мне это трактовать? Он до деститысячных миллисекунды считает? Вот это точность.

Вот код. flag - это просто булевское свойство.

Код

private void button2_Click(object sender, EventArgs e)
        {
            if (flag)
            {
                d1 = DateTime.Now;
                flag = false;
            }
            else
            {
                d2 = DateTime.Now;
                TimeSpan difference = d2.Subtract(d1);
                MessageBox.Show(difference.TotalMilliseconds.ToString());
                d1 = DateTime.Now;
            }






Автор: THandle 4.5.2020, 15:28
Цитата(PsiMagistr @  4.5.2020,  09:47 Найти цитируемый пост)
Как мне это трактовать? Он до деститысячных миллисекунды считает? Вот это точность.


Да, https://docs.microsoft.com/ru-ru/dotnet/api/system.timespan.totalmilliseconds?view=netcore-3.1  smile 

Ну а так, всегда можно округлить или отбросить дробную часть, если она не нужна.

Автор: PsiMagistr 4.5.2020, 15:51
Цитата(THandle @ 4.5.2020,  15:28)
Цитата(PsiMagistr @  4.5.2020,  09:47 Найти цитируемый пост)
Как мне это трактовать? Он до деститысячных миллисекунды считает? Вот это точность.


Да, https://docs.microsoft.com/ru-ru/dotnet/api/system.timespan.totalmilliseconds?view=netcore-3.1  smile 

Ну а так, всегда можно округлить или отбросить дробную часть, если она не нужна.

Аха, спасибо большое.

Пишу одноразовый шифроблокнот. Для генерации ключей понадобились случайные числа. Не какие-нибудь псевдослучайные, а истинно случайные.
Что делать? Раскопал RNGCryptoServiceProvider и создал с его помощью генератор криптографически случайных.
Этого показалось мало, сделал ручной кликабельный генератор - фиксируются координаты клика мыши, время между двумя кликами и на основе группы кликов создаются разный начальный seed для псевдогенератора Random. Каждый новый щелчок - новый seed, новая группа чисел.

Пойдет такое?

Продолжаем извлекать хаос из детерминированного источника... )))

Автор: THandle 4.5.2020, 17:48
Честно говоря, мне кажется, это какой-то довольно странный способ генерации случайных чисел)

На мой взгляд того же RNGCryptoServiceProvider вполне хватило бы)

Или это просто желание попробовать разные ручные варианты?

Цитата(PsiMagistr @  4.5.2020,  16:51 Найти цитируемый пост)
Не какие-нибудь псевдослучайные, а истинно случайные.


Ну все равно вся эта история по сути псевдослучайна, просто у тебя в качестве "шума" используются координаты и время клика.

Автор: PsiMagistr 5.5.2020, 07:49
Цитата(THandle @ 4.5.2020,  17:48)
Честно говоря, мне кажется, это какой-то довольно странный способ генерации случайных чисел)

На мой взгляд того же RNGCryptoServiceProvider вполне хватило бы)

Или это просто желание попробовать разные ручные варианты?

Цитата(PsiMagistr @  4.5.2020,  16:51 Найти цитируемый пост)
Не какие-нибудь псевдослучайные, а истинно случайные.


Ну все равно вся эта история по сути псевдослучайна, просто у тебя в качестве "шума" используются координаты и время клика.

Может быть и странный. Вот он.

х, у - координаты указателя.
d1, d2 - засекатели времени.
flag - булева переменная.

Код

 public StringBuilder getMouseRandom(int x, int y)
        {
            int count = x + y;            
            if(count % 10 == 0)
            {
                count = 10;
            }
            else
            {
                count = count % 10;
            }
            if (flag)
            {
                d1 = DateTime.Now;
                flag = false;
                this.Seed = x * y * DateTime.Now.Millisecond;
            }
            else
            {
                d2 = DateTime.Now;
                TimeSpan difference = d2.Subtract(d1);
                this.Seed = (int)difference.TotalMilliseconds;                
                d1 = DateTime.Now;
            }                        
            int num = 0;
            StringBuilder s = new StringBuilder();
            Random R = new Random(this.Seed * x * y);
            for (int i = 0; i < count; i++)
            {
                num = R.Next(10);
                s.Append(num);               
            }
            return s;
        }


Добавлено через 2 минуты и 51 секунду
А это случайное число от мин до макс через RNGCryptoServiceProvider.

Код

 public int getSecurityRandom(int min, int max)
        {
            uint scale = uint.MaxValue;
            using (this.Rand = new RNGCryptoServiceProvider())
            {
                while (scale == uint.MaxValue)
                {
                    // Get four random bytes.
                    byte[] four_bytes = new byte[4];
                    Rand.GetBytes(four_bytes);
                    // Convert that into an uint.
                    scale = BitConverter.ToUInt32(four_bytes, 0);
                }
            }           

            // Add min to the scaled difference between max and min.
            return (int)(min + (max - min) * (scale / (double)uint.MaxValue));
        }


Добавлено через 6 минут
Шут с этой истинной случайностью, а насколько это криптостойко?

Оба способа.

Как Вам кажется?

Автор: THandle 5.5.2020, 14:50
На мой взгляд, оба варианта одинаковы в плане криптостойкости) в качестве seedа используется же конструкция одного и того же типа, просто полученная немного разными псевдослучайными путями.
Вопрос в том, какой результат нужно получить. Я придерживаюсь того, что в подавляющем большинстве случаев не стоит придумывать велосипед, а лучше использовать готовые решения, в том числе и в криптографии.

Если интересна криптография, я бы наверное посоветовал пройти вот этот вот https://www.coursera.org/learn/crypto.

Автор: PsiMagistr 5.5.2020, 17:34
Цитата(THandle @ 5.5.2020,  14:50)
На мой взгляд, оба варианта одинаковы в плане криптостойкости) в качестве seedа используется же конструкция одного и того же типа, просто полученная немного разными псевдослучайными путями.

Доброго времени суток.

Спасибо огромное!

Нужна либо истинно случайная последовательность, либо на худой конец криптостойкая.
Без этого одноразовый блокнот теряет свой смысл... И из невзламываемого становится взламываемым. 
Я просто сторонним библиотекам не особо доверяю, может и зря. Кроме того хочется и самому попробовать...
А вариант с шумом от мышиного х-у не очень?

Автор: THandle 5.5.2020, 17:41
Цитата(PsiMagistr @  5.5.2020,  18:34 Найти цитируемый пост)
А вариант с шумом от мышиного х-у не очень? 


Ну в случае если хочется самому попробовать, то почему бы и нет. Пробовать надо, это дело хорошее  smile 

Автор: PsiMagistr 5.5.2020, 18:16
Цитата(THandle @ 5.5.2020,  17:41)
Цитата(PsiMagistr @  5.5.2020,  18:34 Найти цитируемый пост)
А вариант с шумом от мышиного х-у не очень? 


Ну в случае если хочется самому попробовать, то почему бы и нет. Пробовать надо, это дело хорошее  smile

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

Я так понимаю даже криптостойкий генератор требованию истинной случайности не отвечает?
Истинная это только на аппаратном уровне решается, да? Типа счетчика Гейгеоа, шумовых замеров, или там датчиков атмосферного давления?
Или я не прав?


Автор: THandle 7.5.2020, 19:36
Ну истинная случайность может порождаться только некими квантовыми процессами, на сколько я помню.
Да и не думаю что для подобного рода задач нужна "истинная" случайность.
Вполне хватит случайности на основе разных составляющих факторов. Хочется мышку и время - пусть так)

Как интересно тема перешла из разницы между датами в дискуссию о случайностях)
Жаль, что на Винграде осталось так мало живых участников(

PsiMagistr, успехов в реализации!)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)