-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSubjects.cs
More file actions
56 lines (44 loc) · 2.69 KB
/
Copy pathSubjects.cs
File metadata and controls
56 lines (44 loc) · 2.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
using System.Runtime.CompilerServices;
using System.Security.Cryptography;
using RandomProof.Types;
namespace RandomProof;
/// <summary>
/// Все измеряемые способы. У каждого NoInlining: иначе компилятор перенесёт
/// код метода в замер и часть работы удалит как ненужную.
///
/// Генераторы создаются заранее и передаются аргументом: создание объекта
/// замеряется отдельно, потому что у двух конструкторов оно устроено
/// по-разному.
/// </summary>
internal static class Subjects
{
// ---------- получение числа ----------
/// <summary>Очередное число из генератора.</summary>
[MethodImpl(MethodImplOptions.NoInlining)]
internal static int Next(Random random) => random.Next();
/// <summary>Число из диапазона.</summary>
[MethodImpl(MethodImplOptions.NoInlining)]
internal static int NextRange(Random random) => random.Next(Payloads.Low, Payloads.High);
/// <summary>Дробное число от нуля до единицы.</summary>
[MethodImpl(MethodImplOptions.NoInlining)]
internal static double NextDouble(Random random) => random.NextDouble();
/// <summary>Длинное число.</summary>
[MethodImpl(MethodImplOptions.NoInlining)]
internal static long NextInt64(Random random) => random.NextInt64();
/// <summary>Заполнение буфера.</summary>
[MethodImpl(MethodImplOptions.NoInlining)]
internal static void NextBytes(Random random, byte[] buffer) => random.NextBytes(buffer);
/// <summary>Заполнение того же буфера криптографическим генератором.</summary>
[MethodImpl(MethodImplOptions.NoInlining)]
internal static void CryptoBytes(byte[] buffer) => RandomNumberGenerator.Fill(buffer);
/// <summary>Число из криптографического генератора.</summary>
[MethodImpl(MethodImplOptions.NoInlining)]
internal static int CryptoNext() => RandomNumberGenerator.GetInt32(Payloads.Low, Payloads.High);
// ---------- создание генератора ----------
/// <summary>Создание без начального значения.</summary>
[MethodImpl(MethodImplOptions.NoInlining)]
internal static Random CreateWithoutSeed() => new();
/// <summary>Создание с начальным значением.</summary>
[MethodImpl(MethodImplOptions.NoInlining)]
internal static Random CreateWithSeed() => new(Payloads.Seed);
}