Random r = new Random();
if(r.Next(1,100) < 20) return "Да";
else return "Нет";
Это глобальный рандом, его использует постер. Нужна синхронизация с ним.Почему?
Когда мы работаем со списком\таблицей мы лочим, чтоб несколько потоков не взяли одну и ту же строку.Это глобальный рандом, его использует постер.
lock
'ом; если же код только берёт данные, без какой-либо их модификации, то я и не лочу такой код. int r = Global.Classes.rnd.Next(0,99);
надо делать лок? Какая проблема может произойти если несколько потоков одновременно обратятся к методу Global.Classes.rnd.Next()?Конечно, не каждый это знает, но Random не потокобезопасен и его использование в шаблоне сопряжено с риском просто "сломать" этот объект,А почему тутint r = Global.Classes.rnd.Next(0,99);
надо делать лок? Какая проблема может произойти если несколько потоков одновременно обратятся к методу Global.Classes.rnd.Next()?
Random rnd = Global.Classes.rnd;
lock(rnd)
{
// далее работа с ним
// rnd.Next(...)
}
а другой вариант есть ?Конечно, не каждый это знает, но Random не потокобезопасен и его использование в шаблоне сопряжено с риском просто "сломать" этот объект,
что приведёт к дублированию результатов или утечке памяти или просто вылету постера.
C#:Random rnd = Global.Classes.rnd; lock(rnd) { // далее работа с ним // rnd.Next(...) }
Создавайте в общем коде свой Random для каждого потока:а другой вариант есть ?
new Random(Guid.NewGuid().GetHashCode())
Это как именно, яснее можно?Чтоб не опытный чел понялСоздавайте в общем коде свой Random для каждого потока:
C#:new Random(Guid.NewGuid().GetHashCode())
Общий код:Это как именно, яснее можно?Чтоб не опытный чел понял
namespace ZennoLab.OwnCode
{
public class CommonCode
{
public static object SyncObject = new object();
[ThreadStatic] public static Random Rnd = new Random(Guid.NewGuid().GetHashCode());
}
}
if(CommonCode.Rnd.NextDouble() < 0.2)
{
project.SendInfoToLog("1");
}
else
{
project.SendInfoToLog("0");
}
if(r.Next(1,100) < 20)
Помню задавался подобным вопросом и такие примеры не советовали использовать, из-за их не особой рандомности.int r = Global.Classes.rnd.Next(0,99); if (r<20)
Последнее false что означает? И как процентуально по спинтаксу результат будет выпадать?Вы также можете использовать:
project.Variables["result"].Value = Macros.TextProcessing.Spintax("{YES|YES|NO|NO|NO|NO|NO|NO|NO|NO}", false);
Последнее false что означает?
И как процентуально по спинтаксу результат будет выпадать?
Можно юзать класс, который используется в криптографии, для генерации случайного числа. Это если начинать уже маньячить.Помню задавался подобным вопросом и такие примеры не советовали использовать, из-за их не особой рандомности.
Советовали сравнивать с double (между 0.0 и 1.0).
А если не глобал задавать а простоОбщий код:
В экшене:C#:namespace ZennoLab.OwnCode { public class CommonCode { public static object SyncObject = new object(); [ThreadStatic] public static Random Rnd = new Random(Guid.NewGuid().GetHashCode()); } }
C#:if(CommonCode.Rnd.NextDouble() < 0.2) { project.SendInfoToLog("1"); } else { project.SendInfoToLog("0"); }
тоже интересует.А если не глобал задавать а просто
var rnd = new Random();
тоже лок надо ?
А если не глобал задавать а просто
var rnd = new Random();
тоже лок надо ?
А тут уже проблема, что вам придётся (зачем-то) создавать объект класса CommonCode и где-то его хранить.тоже интересует.
project.Context["rnd"] = new Random(Guid.NewGuid().GetHashCode());
Random rnd = project.Context["rnd"];
// return rnd.Next(1, 10);
Я не понял при чем здесь CommonCode и где его хранить надо ....А тут уже проблема, что вам придётся (зачем-то) создавать объект класса CommonCode и где-то его хранить.
var rnd = new Random();
var p = rnd.Next(200);
return p;
Как в этот код переменную вставить, вместо 20?C#:Random r = new Random(); if(r.Next(1,100) < 20) return "Да"; else return "Нет";
Как в этот код переменную вставить, вместо 20?
int i = int.Parse(project.Variables["pr"].Value);
Random r = new Random();
if(r.Next(1,100) < i) return "Да";
else return "Нет";
Если в переменной pr будет цира 60 то 60% будет да или нет?C#:int i = int.Parse(project.Variables["pr"].Value); Random r = new Random(); if(r.Next(1,100) < i) return "Да"; else return "Нет";
Random rnd = Global.Classes.rnd;
lock(rnd)
{
Random r = new Random();
if(r.Next(1,100) < 50) return "Да";
else return "Нет";
}
int i = int.Parse(project.Variables["pr"].Value);
Random r = new Random();
if(r.Next(1,100) < i) return "Да";
else return "Нет";
хз)) Вроде да, по успеху будет 60% идти.Если в переменной pr будет цира 60 то 60% будет да или нет?
Да он не работает, щас проверю еще раз.Что то не то, вроде работает, но что-то не так.
Работает, но как то не так, если сделать 50 на 50 должно через раз, быть да и нет, а он этого не делает. Я хотел очередность, куда идти в процентах устанавливать.хз)) Вроде да, по успеху будет 60% идти.
Честно не понял, что ты написал. Да он не работает, щас проверю еще раз.
С чего ты взял)) Так не должно быть. Это вероятность, ее нельзя предсказать. Снипет работает, проверил.Работает, но как то не так, если сделать 50 на 50 должно через раз, быть да и нет, а он этого не делает.
Если надо очередность, то это совсем другая задача.Я хотел очередность, куда идти в процентах устанавливать.