Перемешивание массива [РЕШЕНО]

Автор raptor, 8 февраля 2011, 22:13

0 Пользователи и 1 гость просматривают эту тему.

convas

Тоже интересно:

Sub IntMinus

MsgBox Int(-0.00000000001)   ' -1
MsgBox Int(-1.00000000001)   ' -2

End Sub

bormant

И что тут интересного? Тут как раз так, как должно быть, Int() -- максимальное целое, меньшее аргумента.
Автору на яд. Поддержать форум.

Рыбка Рио

Цитата: convas от 10 февраля 2011, 17:34
Тоже интересно:

Sub IntMinus

MsgBox Int(-0.00000000001)   ' -1
MsgBox Int(-1.00000000001)   ' -2

End Sub
Да, так и должно быть. Есть ещё cInt - он округляет вроде до ближайшего целого.
ubuntu 12.04 + LibO3.6.0

Рыбка Рио

Новая версия расширения: Mixer for Calc 0.1.3 или во вложении к этому сообщению.

[вложение удалено Администратором]
ubuntu 12.04 + LibO3.6.0

convas


bormant

Вот такая статистика:

Sub TestRnd
  tries& = 10000000
  s% = 0
  For i& = 1 To tries
    If Rnd = 1 Then s = s + 1
  Next
  MsgBox s / tries
End Sub

3,28E-05, т.е. вероятность выпадения 1 примерно равна 0,0000328, что весьма не мало. Что, в свою очередь, способно ломать алгоритмы, рассчитанные на документированный для Basic-а диапазон значений RND [0;1).
Автору на яд. Поддержать форум.

bormant

Автору на яд. Поддержать форум.

Рыбка Рио

Цитата: bormant от 11 февраля 2011, 10:31
http://qa.openoffice.org/issues/show_bug.cgi?id=116920
"asigned to ab" означает, что можно ждать годы (см. Issue list). Лучше исправить самим (кто умеет?) и отправить патч на Dev LibreOffice List. Или написать в LibO bugzilla или привлечь внимание к проблеме через список рассылки. Лучше сразу, по-моему, поменять генератор случайных чисел на mersenne twister (Issue 14730).
ubuntu 12.04 + LibO3.6.0

Рыбка Рио

Короче, "ab" это,можно сказать, мертвый ак.
ubuntu 12.04 + LibO3.6.0

Рыбка Рио

(хотя не мёртвый, см. Issue 76852

Sub Main
Dim x as single
      x = 1000000
      print CStr(x)
End Sub

)
ubuntu 12.04 + LibO3.6.0

Рыбка Рио

Цитата: bormant от 11 февраля 2011, 07:493,28E-05, т.е. вероятность выпадения 1 примерно равна 0,0000328
Это, похоже, проблема Windows, но не Linux. На Linux макрос даёт 0.

Не знаю, тут ли нужно исправлять, но вот такой патч мог бы решить проблему (не знаю). На Linux всё номаьно работает и с этим патчем и без него макрос даёт 0.

---
basic/source/runtime/methods.cxx |    2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/basic/source/runtime/methods.cxx b/basic/source/runtime/methods.cxx
index 525d001..b54c774 100644
--- a/basic/source/runtime/methods.cxx
+++ b/basic/source/runtime/methods.cxx
@@ -3447,7 +3447,7 @@ RTLFUNC(Rnd)
     else
     {
         double nRand = (double)rand();
-        nRand = ( nRand / (double)RAND_MAX );
+        nRand = ( nRand / (double)(RAND_MAX + 1) );
         rPar.Get(0)->PutDouble( nRand );
     }
}
--
ubuntu 12.04 + LibO3.6.0

Рыбка Рио

"RAND_MAX assumed to be 32767" файл ./berkeleydb/unxlngi6.pro/misc/build/db-4.7.25.NC/clib/rand.c
/*
* Copied from the ANSI C standard 4.10.2.2.
*/
#include "db_config.h"

#include "db_int.h"

/*
* rand, srand --
*
* PUBLIC: #ifndef HAVE_RAND
* PUBLIC: int rand __P((void));
* PUBLIC: void srand __P((unsigned int));
* PUBLIC: #endif
*/
int rand(void) /* RAND_MAX assumed to be 32767 */
{
DB_GLOBAL(rand_next) = DB_GLOBAL(rand_next) * 1103515245 + 12345;
return (unsigned int) (DB_GLOBAL(rand_next)/65536) % 32768;
}

void srand(unsigned int seed)
{
DB_GLOBAL(rand_next) = seed;
}

Вот и получается, что на Windows 1/32767*100% - это единицы.
ubuntu 12.04 + LibO3.6.0

Рыбка Рио

Выходит, нужно либо вот эту строчку return (unsigned int) (DB_GLOBAL(rand_next)/65536) % 32768; заменить на return (unsigned int) (DB_GLOBAL(rand_next)/65536) % 32767;
либо как в патче выше (?)
ubuntu 12.04 + LibO3.6.0

Рыбка Рио

Цитата: Клио от 12 февраля 2011, 11:56+        nRand = ( nRand / (double)(RAND_MAX + 1) );
Совсем ку-ку.После этого патча все rnd стали почему-то отрицательными.
+        nRand = ( nRand / ((double)(RAND_MAX) + 1));
ubuntu 12.04 + LibO3.6.0

convas

#29
Для функции rand() из библиотеки функций на С, RAND_MAX=32767 - максимальное значение, которое эта функция может принимать [0;32767].
Ошибка возникает при пересчете значений библиотечной функции rand(), со значениями на [0;32767], в новую функцию Rnd(), со значениями на [0;1).