Отличающаяся работа random на разных платформах

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Отличающаяся работа random на разных платформах

Сообщение java73 » 16.07.2015 13:31:49

Друзья, возникла такая ситуация, которая поставила в тупик.
В одной тестовой программе есть у меня массив из 70 объектов класса с таким конструктором:
Код: Выделить всё
constructor TCustomPetal.Create(Xmax, Ymax: integer);
begin
  inherited Create;
  CX:=Random(Xmax);
  CY:=Random(Ymax);
  RColor:=1+Random($FFFFFFF0);
  Scale := 2+Random(12);
end;

На форме таймер, период срабатывания - 100 миллисекунд, каждый раз создается один из 70 новых объектов (по кругу).
На платформе windows XP 32 все работает замечательно, но вот на платформе Ubuntu 15.04 x64 все работает странно. Сначала я визуально растерялся: программа создала пять первых объектов и будто зависла, потом секунд через 10 стерла старые и создала опять новых штук 5.
Выяснил, что функция Random в определенный момент начинает генерировать ОДНО и ТОЖЕ число, а с учетом периода таймера 100 мс - количество одинаково сгенерированных чисел просто абсурдное какое-то.

Как думаете, в чем загвоздка? (Randomize не предлагать, с нею сразу же начинает генерироваться одинаковое число бесконечно).
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Re: Отличающаяся работа random на разных платформах

Сообщение vada » 16.07.2015 14:26:21

Какой-то бред :( Такого не может быть никогда. Это даже не дыра в безопасности. Это распахнутые ворота! НЕ ВЕРЮ!
Выяснил, что функция Random в определенный момент начинает генерировать ОДНО и ТОЖЕ число, а с учетом периода таймера 100 мс - количество одинаково сгенерированных чисел просто абсурдное какое-то.

Точно Randomize не вызывается?
А проверить?
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Отличающаяся работа random на разных платформах

Сообщение java73 » 16.07.2015 15:10:27

Зуб даю, всё так и есть. Вечером дома (на убунте) скину лог генератора случ.чисел.
Но в любом случае, это факт.
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Re: Отличающаяся работа random на разных платформах

Сообщение resident » 16.07.2015 16:50:43

java73 писал(а):ситуация, которая поставила в тупик

Может свой генератор замутить?
Существует шикарная книга (по моему лучшая о Паскале) "Фундаментальные алгоритмы и структуры данных в Delphi" автор Дж. Бакнелл.
http://rutracker.org/forum/viewtopic.php?t=305364
Там генераторы на пальцах разобраны (Глава 6. Рандомизированные алгоритмы), можно оттуда тупо скопировать. Там и тесты есть для проверки генератора.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Отличающаяся работа random на разных платформах

Сообщение vada » 16.07.2015 16:53:04

На сколько я понял алгоритм генератора, вот это
Код: Выделить всё
Random($FFFFFFF0);
даст последовательность всего из 10 псевдослучайных чисел.
Посмотри исходник Random.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Отличающаяся работа random на разных платформах

Сообщение java73 » 16.07.2015 17:57:33

Вот как программка-тестер отработала в винде XP 32:

Код: Выделить всё
Создаем массив объектов объемом 50
Вызываем randomize...
CX      CY      Цвет      Масштаб      Коэфф.
=================================================
792      157      155BB567      8      8
687      205      94220771      6      7
75      302      00C20EAB      4      4
429      332      34C53BDB      2      3
56      288      E5780B62      7      9
247      333      136BC09D      11      4
88      251      9F0DABA4      3      5
119      310      DF15224E      7      5
291      152      CE7068F4      6      3
194      69      E2D8BD95      12      7
476      72      890F9CD4      13      3
8      61      0E29A613      10      3
48      317      D5D0409C      8      7
396      302      314CADA1      3      3
527      30      E4E4B673      3      4
267      232      97F8718A      13      3
581      203      5FF04BDC      3      4
741      401      A1BB6A6B      8      5
262      374      DAB4AFD0      5      5
113      415      435EEB4D      3      5
793      328      F255DE4F      8      9
557      366      641C330C      2      8
611      395      1FAEC252      6      7
17      137      2572994F      4      7
257      176      533D6454      9      7
260      279      C0827310      7      9
792      48      BB396489      6      3
149      29      DC60123B      8      7
456      438      7275612C      6      4
99      351      9B2FC740      3      2
329      210      E192945E      9      7
648      164      AD1856E8      8      5
414      85      31B4DA88      9      4
239      204      CD1D64D9      11      9
795      242      38D26769      4      3
739      145      1858C1F8      10      8
503      382      3F327713      8      4
684      457      7D3C3CA8      5      8
646      200      3BDCF50C      5      3
269      257      2689B5E3      10      4
449      423      19F06C6D      9      8
33      296      82E23A48      6      7
13      216      51163E39      5      3
46      118      31AEFBC0      7      8
634      209      3E083374      2      3
424      103      23ED3F47      8      5
737      380      5E771F5A      6      2
606      256      AC055845      12      4
50      476      ABE940E6      11      6
18      460      F3DDB521      11      4


Вечером прогоню её дома в убунте и посмотрим.........

Добавлено спустя 3 часа 5 минут 53 секунды:
Мистика.... так дома, всё работает:
Код: Выделить всё
Создаем массив объектов объемом 50
Вызываем randomize...
CX      CY      Цвет      Масштаб      Коэфф.
==========================================================================
572      93      A13737AD      4      4
524      177      A58CAF2D      3      3
347      44      3D1BFA58      2      8
85      147      EB64FF94      10      3
686      15      1BB10939      4      3
524      131      59CCDA50      12      2
768      423      CBA0C37D      8      9
779      265      F400D75C      6      9
29      388      0458C3EB      8      8
731      74      94AEFDEA      6      8
761      145      2AE5369B      7      2
494      302      5CCA70F3      8      6
102      15      C3727265      13      4
552      46      B7719BA6      6      8
776      234      B31DA549      2      9
275      4      7B42A0D0      4      6
334      279      DAEFA990      13      4
649      473      7AE99C0D      3      3
552      42      28D1E22F      11      5
193      110      018575EA      8      5
81      226      6D7D4CDA      11      2
621      111      48468D83      4      5
650      57      89F0517A      7      3
762      343      B9FCA857      13      5
198      300      5608AE33      10      8
20      146      386B03A7      11      4
160      366      8B7C4513      2      3
400      156      56797E2E      7      7
367      381      A98257D5      10      4
497      82      ABD33C78      11      2
350      298      F7BEB55E      4      4
799      450      FD95193A      12      9
243      443      D4A0DE7F      4      6
392      142      1B1923C9      7      6
271      125      30685175      8      2
349      22      135A38A0      10      4
421      459      917EC345      12      3
625      207      6D9BC6A3      3      6
465      12      4DFB6B63      2      6
96      6      283F7DA5      5      2
239      165      12D701DC      13      9
740      462      1304E16F      13      8
579      45      B07E51A5      2      2
75      54      F376DE9C      8      8
680      337      FFAE84BF      11      8
325      59      58BE8074      8      9
146      457      52975BBF      8      7
381      278      934AF304      13      2
728      237      53EA708C      6      6
151      36      7A3E7F6E      4      3


Добавлено спустя 34 минуты 57 секунд:
Куда зуб присылать? Рандом не уиноуат(((
все дело в тригонометрических вычислениях в этом методе:
Код: Выделить всё
procedure TCustomPetal.DrawPetal(Canv: TCanvas; Erase: boolean);
begin
  phi:=0;
  if Erase then RColor:=$00000000;
  with Canv do
    while phi < K*pi do
    begin
      R := 10 * sin(PetalI * phi);   
      X := CX + Trunc(Scale * R * Cos(phi));
      y := CY - Trunc(Scale * R * Sin(phi));
      Pixels[x, y] := RColor;
      phi := phi + pi / 1800;
    end;
end;\0


Я так думаю, причина где-то здесь:
Код: Выделить всё
{$ifdef CPUX86_64}
{$ifdef FPC_HAS_TYPE_EXTENDED}
  { win64 doesn't support the legacy fpu }
  {$define DEFAULT_EXTENDED}
  {$define SUPPORT_EXTENDED}
  {$define SUPPORT_COMP}
  {$ifndef FPUNONE}
    ValReal = Extended;
  {$endif}\0


Но как мне упростить вычисления тригонометрические????
Я как-то был уверен, что четырехядерный amd немного пошустрее их производит, нежели старый двухядерный селерон, а выходит наоборот?

Добавлено спустя 1 час 22 минуты 45 секунд:
Под виндой на этом компьютере тоже все замечательно
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Re: Отличающаяся работа random на разных платформах

Сообщение Снег Север » 16.07.2015 23:15:09

Перед любым использованием Random надо обязательно вызывать Randomize. И никак иначе.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3052
Зарегистрирован: 27.11.2007 16:14:47

Re: Отличающаяся работа random на разных платформах

Сообщение Mirage » 17.07.2015 04:41:02

Не понимаю как можно спутать генерацию одного и того же рандома с неверной тригонометрией.
Да и что не так с последней непонятно. Скорость её расчета на корректность не влияет.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Отличающаяся работа random на разных платформах

Сообщение Лекс Айрин » 17.07.2015 09:52:24

java73 писал(а):Я как-то был уверен, что четырехядерный amd немного пошустрее их производит, нежели старый двухядерный селерон, а выходит наоборот?


как ни странно, но функция считается одним ядром. Так что все нормально -- у двухядерника скорость одного ядра может быть и поболее.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Отличающаяся работа random на разных платформах

Сообщение vada » 17.07.2015 11:15:28

Но как мне упростить вычисления тригонометрические????

Мне как-то нужно было синусы/косинусы считать... Много! Очень много! В циклах.
Вот только углы были с точностью до пол градуса :) В общем, таблицу сделал с уже посчитанными значениями.
Работало быстро!!!!! :D
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Отличающаяся работа random на разных платформах

Сообщение java73 » 17.07.2015 11:52:18

Mirage писал(а):Mirage » 17.07.2015 04:41:02

Не понимаю как можно спутать генерацию одного и того же рандома с неверной тригонометрией.
Да и что не так с последней непонятно. Скорость её расчета на корректность не влияет.

Объясняю)
У меня объекты рисуют на экране полярные розы, эдакий самопальный скринсейвер. На старом компе на винде все нормально работало, собрал дома - нарисовалось пять роз и пауза....потом опять несколько и опять пауза... Я стал думать, что такое. Ввел костыль, который пишет текущий номер объекта на экране по координатам CX и СY которые генерирует конструктор объекта. И вот запускаю, пять роз создалось в разных местах, а потом несколько номеров быстро начали меняться в одном и том же месте. Я и подумал, что несколько объектов создается с одинаковыми полями, а они генерируются как раз рандомно.
Почему это происходит, я не разобрался.
Собрал на том же компе, но под виндой 7 32бит, и все опять нормально.
Я думаю на 64-битную убунту, от нее и так слишком много проблем - начиная с проблемной сборки самого лазаруса, и заканчивая невозможностью использовать некоторые компоненты. Да и некоторые другие приложения косячут. так что мой роман с 64 битными ОС пришел к концу, мы расстаемся.
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Re: Отличающаяся работа random на разных платформах

Сообщение Снег Север » 18.07.2015 07:14:11

nix-проблемы... :lol:
У меня на вин7 СТ идеально собирает х64 приложения.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3052
Зарегистрирован: 27.11.2007 16:14:47

Re: Отличающаяся работа random на разных платформах

Сообщение Vadim » 18.07.2015 07:22:18

java73 писал(а):... - начиная с проблемной сборки самого лазаруса, ...

Позвольте Вас опровергнуть. ;-)
Я уже года 4 как пользуюсь именно 64-х битными убунтами и Лазарус всегда собираю вручную. Ни разу проблем с этим делом не заметил. :-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 5

Рейтинг@Mail.ru