Альтернатива VBMath.Rnd() в C#

239
18 июля 2017, 17:19

Рассматривал пример программы, в которой весь код написан на C#, а в одной функции используется фрагмент, написанный на VB. Вопрос в том, как перевести этот фрагмент также на С#?

public Cell getNeighbor()
{
    List<Cell> c = new List<Cell>();
    if (!(NeighborNorthID == "none") && Cells[NeighborNorthID].Visited == false)
        c.Add(Cells[NeighborNorthID]);
    if (!(NeighborSouthID == "none") && Cells[NeighborSouthID].Visited == false)
        c.Add(Cells[NeighborSouthID]);
    if (!(NeighborEastID == "none") && Cells[NeighborEastID].Visited == false)
        c.Add(Cells[NeighborEastID]);
    if (!(NeighborWestID == "none") && Cells[NeighborWestID].Visited == false)
        c.Add(Cells[NeighborWestID]);
    int max = c.Count;
    Cell currentCell = null;
    if (c.Count > 0)
    {
        Microsoft.VisualBasic.VBMath.Randomize();
        int index = Convert.ToInt32(Conversion.Int(c.Count * VBMath.Rnd()));
        currentCell = c[index];
    }
Answer 1

VBMath.Rnd() - функция, возвращающая случайное число. В С# можете воспользоваться классом Random.

Random rnd1 = new Random();  
var randomNum = rnd1.Next();
Answer 2

Метод VBMath.Rnd() возвращает случайное число типа System.Single (то есть, float с точки зрения C#) между 0 и 1.

Для C# аналогичной функциональностью обладает функция NextDouble класса Random. Учитывая вызов Randomize() перед вызовом Rnd(), нам необходимо инициализированное текущим системным временем случайное число.

Далее, конструкция Convert.ToInt32(Conversion.Int(c.Count * VBMath.Rnd())) выдаёт случайное целое число от 0 до c.Count (исключая верхнюю границу). Это достигается более простым методом на C#, т. к. равномерно распределённое целое число можно получить и прямо, без участия плавающей запятой:

var random = new Random(); // инициализирует текущим временем
int index = random.Next(c.Count);
currentCell = c[index];

Учтите, что результат будет не один-в-один таким же, как в с кодом на VB, т. к. алгоритмы подсчёта случайных чисел и использование seed в них отличаются. Тем не менее, поскольку речь идёт о случайных числах, повторение результата обычно и не нужно.

READ ALSO
ELMA - передать значение переменной JS в контекстную

ELMA - передать значение переменной JS в контекстную

В общем, вопрос в комментариях

248
Изменения ячейки по индексу в dataGrid WPF

Изменения ячейки по индексу в dataGrid WPF

Подскажите пожалуйста как кодом изменить значение ячейки например при нажатии кнопки

359
Переменная JS и Ajax.BeginForm(). Как передать

Переменная JS и Ajax.BeginForm(). Как передать

Привет если ajax запрос через форму

248
Удалить строку из DataGrid wpf

Удалить строку из DataGrid wpf

Подскажите пожалуйста как удалить выделенную строку при нажатии Del знаю только как определить выделение и как определить нажатие Del

421