RandomNumberGenerator
Независимый генератор игровой псевдослучайной последовательности.
У экземпляра собственные Seed/State; конструктор случайно инициализируется. Задайте Seed для повторяемого начала, сохраните/верните State для продолжения. Если восстанавливаете оба, сначала Seed, затем State. Параметры и порядок вызовов должны совпадать.
Не обещает криптографическую защиту, сетевой детерминизм или одинаковую последовательность будущих версий. RandWeighted возвращает индекс: валидируйте конечные неотрицательные веса и конечную положительную сумму. Отсутствие выбора −1 нельзя использовать как индекс массива.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
RandomNumberGeneratorКонструктор
public RandomNumberGenerator();Создаёт отдельный генератор с собственным Seed и State и автоматически вызывает Randomize(). Нулевые значения из метаданных справочника не являются обещанием начального seed. Для повторяемого результата задайте Seed до первого случайного вызова. Автоматическая инициализация не гарантирует уникальный seed для каждого созданного экземпляра.
Свойства2
SeedСвойство
public ulong Seed { get; set; }Задаёт начало последовательности и сбрасывает её состояние. При восстановлении Seed/State сначала устанавливайте Seed.
StateСвойство
public ulong State { get; set; }Состояние для продолжения последовательности с сохранённого места. Восстанавливайте ранее сохранённое значение после Seed; порядок следующих вызовов важен.
Методы12
GetSeedulong
public ulong GetSeed();Возвращает seed, с которого начался текущий поток, как свойство Seed. Чтение не продвигает генератор. Randi и другие случайные вызовы меняют State, но не превращают Seed в текущее состояние.
ulongПоследнее значение инициализации от SetSeed/Seed либо Randomize, как ulong.
GetStateulong
public ulong GetState();Возвращает текущее состояние, как свойство State, без продвижения генератора. Сохранённое значение позволяет продолжить последовательность; начальный Seed не заменяет снимок State.
В примере оба ulong хранятся десятичными строками. Это сохраняет все 64 бита при передаче через форматы, где числа могут преобразовываться в double или знаковый 64-битный тип. TryRestore сначала проверяет обе строки и только затем меняет генератор: Seed перед State. Ошибка ввода не сбрасывает исходное состояние.
using System.Globalization;
using Reckfell;
public static class RandomCheckpoint
{
public static string[] Capture(RandomNumberGenerator rng) =>
[
rng.Seed.ToString(CultureInfo.InvariantCulture),
rng.State.ToString(CultureInfo.InvariantCulture)
];
public static bool TryRestore(RandomNumberGenerator rng, string seedText, string stateText)
{
if (!ulong.TryParse(seedText, NumberStyles.None, CultureInfo.InvariantCulture, out ulong seed)
|| !ulong.TryParse(stateText, NumberStyles.None, CultureInfo.InvariantCulture, out ulong state))
return false;
rng.Seed = seed;
rng.State = state;
return true;
}
}После восстановления повторяйте те же методы с теми же параметрами и в том же порядке. Пример проверен с JSON-массивом строк через System.Text.Json; это не гарантия сетевой синхронизации или одинаковой последовательности в будущих версиях.
ulongСнимок текущего состояния как ulong; чтение не создаёт случайного значения.
RandWeighted2 перегрузки
public long RandWeighted(ReadOnlySpan<float> weights);Выбирает индекс по относительным весам. Проверяйте конечные неотрицательные веса и конечную положительную сумму; при отсутствии выбора −1 не является индексом.
| Имя | Тип | По умолчанию |
|---|---|---|
weights | ReadOnlySpan<float> | — |
weightsНепустой набор конечных неотрицательных весов с конечной положительной суммой. Положение веса определяет возвращаемый индекс. Пустой или отрицательный набор вызывает нативную диагностику; NaN/Infinity следует отвергать до вызова.
longИндекс 0..weights.Length - 1 при корректном выборе, а не значение веса. При отсутствии выбора возвращает -1; проверяйте результат до индексирования. Нулевая сумма не даёт выбора, но продвигает генератор.
public long RandWeighted(float[] weights);Выбирает индекс по относительным весам. Проверяйте конечные неотрицательные веса и конечную положительную сумму; при отсутствии выбора −1 не является индексом.
| Имя | Тип | По умолчанию |
|---|---|---|
weights | float[] | — |
weightsНепустой набор конечных неотрицательных весов с конечной положительной суммой. Положение веса определяет возвращаемый индекс. Пустой или отрицательный набор вызывает нативную диагностику; NaN/Infinity следует отвергать до вызова.
longИндекс 0..weights.Length - 1 при корректном выборе, а не значение веса. При отсутствии выбора возвращает -1; проверяйте результат до индексирования. Нулевая сумма не даёт выбора, но продвигает генератор.
Randffloat
public float Randf();Возвращает псевдослучайный float от 0 до 1 с допустимыми обоими концами. Продвигает состояние; не считайте один вызов Randf эквивалентным одному Randi для воспроизведения. Не вычисляйте индекс как (int)(Randf() * Length): при результате 1 получится индекс за границей.
floatfloat в диапазоне [0, 1]. Это не готовый индекс массива.
RandfRangefloat
public float RandfRange(float from, float to);Выполняет Randf() * (to - from) + from в float. Использует обычную точность float без завершающего Clamp; учитывайте погрешность округления около границ. Переставленные границы не сортируются: меняется направление преобразования одной случайной величины.
Даже при from == to генератор продвигается; это отличается от RandiRange с равными границами. Конечных аргументов недостаточно для защиты от переполнения: разность float.MaxValue - (-float.MaxValue) не помещается во float, и результат может стать Infinity или NaN.
| Имя | Тип | По умолчанию |
|---|---|---|
from | float | — |
to | float | — |
fromПервый конец диапазона. Используйте конечное значение и проверьте представимость to - from.
toВторой конец диапазона; может быть меньше from. Промежуточные вычисления не насыщаются и не ограничиваются автоматически.
floatfloat после указанного преобразования; при переполнении или некорректных входах возможен нечисловой или бесконечный результат.
Randfnfloat
public float Randfn(float mean = 0f, float deviation = 1f);Нормально распределённое значение вокруг mean с заданным deviation. Результат не ограничен mean ± deviation; Clamp меняет распределение.
| Имя | Тип | По умолчанию |
|---|---|---|
mean | float | 0f |
deviation | float | 1f |
meanСреднее распределения, по умолчанию 0. Для обычных игровых расчётов используйте конечное значение.
deviationМасштаб отклонения, по умолчанию 1. Для стандартного отклонения используйте конечное неотрицательное число. 0 возвращает mean, но всё равно продвигает генератор; отрицательное значение API не отклоняет.
floatСлучайное значение с нормальным распределением при корректных параметрах; не ограничено интервалом mean ± deviation.
Randiuint
public uint Randi();Возвращает псевдослучайный uint и продвигает состояние этого экземпляра. Для индекса массива используйте RandiRange(0, Length - 1) только при Length > 0, а не приведение всего uint к int. Порядок и число случайных вызовов участвуют в воспроизведении.
uint32-битное беззнаковое значение в диапазоне 0..4294967295 включительно.
RandiRangeint
public int RandiRange(int from, int to);Возвращает целое с включёнными границами. Для индекса непустого массива используйте 0..Length−1, не 0..Length.
| Имя | Тип | По умолчанию |
|---|---|---|
from | int | — |
to | int | — |
fromОдна включительная граница int. Порядок границ не важен: используется диапазон от меньшей до большей.
toВторая включительная граница int. Для индекса непустого массива верхняя граница — Length - 1.
intint от min(from, to) до max(from, to) включительно, в том числе для полного диапазона int. При равных границах возвращает их значение без продвижения State.
Randomizevoid
public void Randomize();Повторно инициализирует этот экземпляр значением, зависящим от времени и текущего состояния. Обновляет Seed и State. Не требуется перед каждым выбором: это меняет старт потока и мешает воспроизведению. Вызовы не гарантируют уникальность seed. Для воспроизводимого запуска задавайте Seed явно.
SetSeedvoid
public void SetSeed(ulong seed);Устанавливает начальное значение и пересоздаёт внутреннее состояние, как присваивание Seed. Повторная установка того же seed возвращает начало последовательности. Если восстанавливаете seed и состояние, вызовите SetSeed до SetState: обратный порядок сбросит сохранённую точку.
| Имя | Тип | По умолчанию |
|---|---|---|
seed | ulong | — |
seedНачальное значение ulong. При одинаковом алгоритме, параметрах и порядке вызовов задаёт повторяемый старт.
SetStatevoid
public void SetState(ulong state);Заменяет внутреннее состояние, как присваивание State. Сам Seed при этом не меняется. Для продолжения используйте ранее сохранённый GetState()/State; произвольное число не проверяется на пригодность для вашей процедуры воспроизведения. Установка Seed после этого вызова снова переинициализирует состояние.
| Имя | Тип | По умолчанию |
|---|---|---|
state | ulong | — |
stateРанее сохранённое состояние ulong. Сохраняйте полную точность при записи и чтении.