+135
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
// Дефолтный конструктор:
public Random()
: this(Environment.TickCount) {
}
// Перенаправляемся сюда...
public Random(int Seed) {
int ii;
int mj, mk;
//Initialize our Seed array.
//This algorithm comes from Numerical Recipes in C (2nd Ed.)
mj = MSEED - Math.Abs(Seed);
Очередной "изящный" говнокод в исходниках .NET.
Говнокод в том, что Environment.TickCount через каждые 24,9 дней возвращает Int32.MinValue, который скормится Math.Abs, который резонно выкинет исключение OverflowException. Вроде бы мелочь, но... Вспомним теперь падение .NET-софта на Лондонской бирже и последующие миллионные убытки. Для загруженных non-stop-серверов непростительно. Хотя в принципе Microsoft аптаймами и не славился :)
Запостил: cfdev,
27 Апреля 2010
cfdev 27.04.2010 02:43 # −6
striker 27.04.2010 02:45 # −3
inkanusinho 22.08.2021 23:05 # −21
Paskal 22.08.2021 23:12 # −6
CBuHOKYP 08.10.2021 20:59 # −6
comnimh 27.04.2010 03:13 # −5
И опять же кстати категорически непонятно почему Environment.TickCount может быть отрицательным.
Короче странный он этот .NET %)
comnimh 27.04.2010 03:22 # −7
cfdev 27.04.2010 03:36 # −5
Что значит "по идее"? Для Int32.MinValue нет соответствующего позитивного значения, т.к. целые числа кодируются неортогонально: MinValue = -2147483648, в то время как MaxValue = 2147483647.
msdn конечно же нигде не указывает, что Random() теоретически может выкинуть исключение. Стабильная, надёждная managed-платформа :)
> И опять же кстати категорически непонятно почему Environment.TickCount может быть отрицательным
К этому же вопросу: почему индексы у массивов имеют тип int, а не uint? Ответ скорей всего кроется в том, что .NET создана из кусков трупа J++, а в java нет uint...
cfdev 27.04.2010 03:48 # −5
скорей всего, см. 2 пункт про J++ или просто конвеншон: "какой тип получаем, такой и должны возвратить"
long Abs(long);
int Abs(int);
short Abs(short);
guest 27.04.2010 07:48 # −8
comnimh 27.04.2010 14:17 # −5
В джаве еще кстати, оказывается, нет int8 и int16 - ну, то есть, они как бы есть, но внутри это все равно всегда int32 %)
cfdev 27.04.2010 17:11 # −6
В НЕТе всякие uint32 сделаны, похоже, чисто для PInvoke
comnimh 28.04.2010 23:52 # −6
TarasB 28.04.2010 22:30 # −5
А какими они ещё должны быть на 32-разрядной платформе?
comnimh 28.04.2010 23:49 # −6
А то что ж это получается, мне для того, чтобы завести массив флагов, надо на каждый элемент четыре байта потратить?
Про выравнивание я знаю, спасибо.
anonimb84a2f6fd141 18.02.2014 17:41 # −6
AxisPod 27.04.2010 07:22 # −13
2. Эксепшена не будет.
3. Код полностью нормальный.
guest 27.04.2010 07:55 # −8
http://www.rsdn.ru/forum/dotnet/1509710.flat.aspx
Math.Abs(-2147483648)==2147483648, но это не возможно, так как предельное значение int32 = 2147483647. Overflow Exception.
guest 27.04.2010 07:55 # −10
cfdev 27.04.2010 17:19 # −1
guest 27.04.2010 18:31 # −10
Что-за велосипед?
cfdev 27.04.2010 18:38 # −5
guest 27.04.2010 19:55 # −10
comnimh 28.04.2010 23:50 # −6
guest 29.04.2010 17:26 # −10
comnimh 29.04.2010 17:39 # −5
guest 01.05.2010 11:55 # −12
guest 27.04.2010 08:25 # −7
2. Эксепшн будет
3. Код нормальный, потому что Environment.TickCount не возвращает int.MinValue
The value of this property is derived from the system timer and is stored as a 32-bit signed integer. Consequently, if the system runs continuously, TickCount will increment from zero to Int32..::.MaxValue for approximately 24.9 days, then jump to Int32..::.MinValue, which is a negative number, then increment back to zero during the next 24.9 days.
guest 27.04.2010 08:26 # −7
3. Код не нормальный, потому что Environment.TickCount возвращает int.MinValue.
Зачем - одному Б-гу известно.
guest 27.04.2010 08:27 # −16
Ага. Всегда возвращает. Каждую секунду Environment.TickCount==int.MinValue.
guest 27.04.2010 09:14 # −10
comnimh 27.04.2010 14:17 # −6
3.14159265 27.04.2010 15:23 # −2
Ага, но твой код упадет в самый неподходящий момент.
с вероятностью 1/2^32 вы получите эксепшн
это объясняет многие случайные глюки других продуктов Микрософта :D
cfdev 29.04.2010 18:53 # −6
guest 29.04.2010 19:42 # −11
но не было.
cfdev 30.04.2010 01:59 # −3
Было:
Стало:
CBuHOKYP 08.10.2021 21:00 # −6
cfdev 01.05.2010 08:49 # −6
abatishchev 23.01.2012 16:49 # −5
guest 10.05.2013 18:11 # −10
public Random(int Seed)
{
this.SeedArray = new int[56];
base.ctor();
int num1 = 161803398 - (Seed == int.MinValue ? int.MaxValue : Math.Abs(Seed));
//...
pyshpysh 11.10.2021 03:00 # −6
pyshpysh 11.10.2021 03:28 # −6
3arJlywka 11.10.2021 03:42 # −4