Почему я не могу произойти из долго?

Статистика. Фактический стандарт для тестирования RNGs Несгибаемый комплект (первоначально доступен в http://stat.fsu.edu/pub/diehard ). С другой стороны, программа Ent обеспечивает тесты, которые более просты интерпретировать, но менее всесторонний.

Что касается перестановки алгоритмов, используйте известный алгоритм такой в качестве Фишер-Йетс (иначе "Перестановка Knuth"). Перестановка будет однородно случайна, пока базовый RNG однородно случаен. При использовании Java этот алгоритм доступен в стандартной библиотеке (см. Collections.shuffle).

Это, вероятно, не имеет значения для большинства приложений, но знает, что большинство RNGs не обеспечивает, достаточные степени свободы для создания каждой возможной перестановки 52 колод карт (объяснил здесь ).

6
задан Captain Comic 23 November 2009 в 12:40
поделиться

6 ответов

Как уже упоминалось, типы значений в .NET запечатаны, поэтому вы не можете получить их от long. Вы должны создать методы расширения, как предлагается.

Пример

public static class LongExtensions
{
    public static long GetLowerValue(this long value)
    {
        ...
    }

    public static long GetHigherValue(this long value)
    {
        ...
    }
}
11
ответ дан 8 December 2019 в 03:09
поделиться

Вы не можете наследовать ни от одного из типов значений .NET - все они запечатаны по определению.

Возможно, вы могли бы реализовать свои методы GetLowerValue и GetHigherValue как методы расширения?

6
ответ дан 8 December 2019 в 03:09
поделиться

Моя функция возвращает некоторое длинное значение, которое содержит два значения в младших и старших 32-х битах.

Это звучит как действительно очень грязный прием. Это может быть подходящим для языков, близких к металлу (например, C), но не для более высокого уровня, объектно-ориентированный язык.

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

5
ответ дан 8 December 2019 в 03:09
поделиться

Вы можете написать структуру с операторами неявного преобразования. Это будет работать именно так, как вы хотите:

public struct SubmitOrderResult
{
    private long _result;

    public SubmitOrderResult(long result)
    {
        _result = result;
    }

    public long Result
    {
        get { return _result; }
        set { _result = value; }
    }

    public int GetHigherValue()
    {
        return (int)(_result >> 32);
    }

    public int GetLowerValue()
    {
        return (int)_result;
    }

    public static implicit operator SubmitOrderResult(long result)
    {
        return new SubmitOrderResult(result);
    }

    public static implicit operator long(SubmitOrderResult result)
    {
        return result._result;
    }
}

Затем вы можете сделать:

SubmitOrderResult result = someObject.TheMethod();
Console.WriteLine(result.GetHigherValue());
Console.WriteLine(result.GetLowerValue());

... так, как вы хотели.

4
ответ дан 8 December 2019 в 03:09
поделиться

Вы не можете преодолеть это.

Поскольку long является запечатанным типом, вы не можете наследовать от них. См. MSDN

Поскольку структуры неявно запечатаны, они не могут быть унаследованы.

Для получения дополнительной информации см. Наследование (Руководство по программированию на C #) .

1
ответ дан 8 December 2019 в 03:09
поделиться

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

public class SubmitOrderResult
{
    private readonly long value_;

    public int OneValue
    { 
        get { return (int)(value_ >> 32); } 
    }

    public int TheOtherValue
    { 
        get { return (int)(value_ & 0xFFFFFFFF); } 
    }

    public SubmitOrderResult(long value)
    { value_ = value; }
}
3
ответ дан 8 December 2019 в 03:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: