Вернуться   CoderX :: Forums > Основные форумы > Курилка
Войти через OpenID

Курилка Флудим и шутим тут!

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Результаты опроса: Вы верите в "Танцы с Бубном"
Да верю, так проще точить. 7 15.22%
Я юзаю астрологический прогноз, и точу по декадам 15 32.61%
Неа не верю, бред всё это... 8 17.39%
Нет не верю, сервер производит вычисления шанса вне зависимости от моего желания и действий 16 34.78%
Голосовавшие: 46. Вы ещё не голосовали в этом опросе

Ответ
 
Опции темы Опции просмотра
Старый 05.04.2009, 12:41   #1
Пользователь
 
Аватар для DzumoHu4
 
Регистрация: 28.06.2008
Сообщений: 73
Сказал Спасибо: 7
Имеет 24 спасибок в 16 сообщенях
DzumoHu4 пока неопределено
Лампочка Мифы о заточке в Lineage II

Видел много тем на разных форумах про заточки, методы точки всякие "Баги" и про "способы" заточки, и скажу прямо это Глупость.
Существует 3 типа серверов.
Java сервера различных команд.(L2j,L2Free,etc)
C++ сервера обычно самописи etc...
Ну и офф Lineage.com.
В каждом по своему реализована функция Random.А значит и процесс заточки в зависимости от платформы отличается
Бред про "Корейский рандом" прошу засунуть в кладовку сумасшедших умозаключений.
поскольку официально проект C успешно загнулся, поговорим про самую распространённую платформу java.
Рандом в Java серверах реализован классом java.security.SecureRandom который импортируется из rt.jar который идёт в комплекте с Java Development Kit компании Sun Microsystems.
В классе Рандом реализован вот такой вот нехитрой функцией
Код:
package java.security;
import java.io.Serializable;
import java.util.Random;
import java.util.Enumeration;
public class SecureRandom extends Random
{
  long counter = 0;  
  MessageDigest digest = null;
  Provider provider = null;
  byte[] randomBytes = null; 
  int randomBytesUsed = 0;
  SecureRandomSpi secureRandomSpi = null;
  byte[] state = null;
  public SecureRandom()
  {
    Provider p[] = Security.getProviders();
    
    String key;
     String classname = null;
    int i, flag = 0;
    Enumeration e;
    for (i = 0; i < p.length; i++)
    {
      e = p[i].propertyNames();
      while (e.hasMoreElements())
      {
        key = (String) e.nextElement();
        if (key.startsWith("SecureRandom."))
          if ((classname = p[i].getProperty(key)) != null)
            break;
      }
      if (classname != null)
        break;
    }

    //if( classname == null)
    //  throw new NoSuchAlgorithmException();

    try
    {
      this.secureRandomSpi =
        (SecureRandomSpi) Class.forName(classname).newInstance();

      //s.algorithm = algorithm;
      this.provider = p[i];
    }
    catch (ClassNotFoundException cnfe)
    {
      //throw new NoSuchAlgorithmException("Class not found");
    }
    catch (InstantiationException ie)
    {
      //throw new NoSuchAlgorithmException("Class instantiation failed");
    }
    catch (IllegalAccessException iae)
    {
      //throw new NoSuchAlgorithmException("Illegal Access");
    }
  }
  public SecureRandom(byte[] seed)
  {
    this();
    setSeed(seed);
  }
  protected SecureRandom(SecureRandomSpi secureRandomSpi, Provider provider)
  {
    this.secureRandomSpi = secureRandomSpi;
    this.provider = provider;
  }

  public static SecureRandom getInstance(String algorithm) throws
        NoSuchAlgorithmException
  {
    Provider p[] = Security.getProviders();

    //Format of Key: SecureRandom.algname
    StringBuffer key = new StringBuffer("SecureRandom.");
    key.append(algorithm);

    String classname = null;
    int i;
    for (i = 0; i < p.length; i++)
    {
      if ((classname = p[i].getProperty(key.toString())) != null)
        break;
    }

    if (classname == null)
      throw new NoSuchAlgorithmException();

    try
    {
      return new SecureRandom((SecureRandomSpi) Class.forName(classname).
                              newInstance(), p[i]);
    }
    catch (ClassNotFoundException cnfe)
    {
      throw new NoSuchAlgorithmException("Class not found");
    }
    catch (InstantiationException ie)
    {
      throw new NoSuchAlgorithmException("Class instantiation failed");
    }
    catch (IllegalAccessException iae)
    {
      throw new NoSuchAlgorithmException("Illegal Access");
    }

  }

  
  public static SecureRandom getInstance(String algorithm,
                                         String provider) throws
        NoSuchAlgorithmException, NoSuchProviderException
  {
    Provider p = Security.getProvider(provider);
    if (p == null)
      throw new NoSuchProviderException();

    //Format of Key: SecureRandom.algName
    StringBuffer key = new StringBuffer("SecureRandom.");
    key.append(algorithm);

    String classname = p.getProperty(key.toString());
    if (classname == null)
      throw new NoSuchAlgorithmException();

    try
    {
      return new SecureRandom((SecureRandomSpi) Class.forName(classname).
                              newInstance(), p);
    }
    catch (ClassNotFoundException cnfe)
    {
      throw new NoSuchAlgorithmException("Class not found");
    }
    catch (InstantiationException ie)
    {
      throw new NoSuchAlgorithmException("Class instantiation failed");
    }
    catch (IllegalAccessException iae)
    {
      throw new NoSuchAlgorithmException("Illegal Access");
    }

  }
  public final Provider getProvider()
  {
    return provider;
  }


  public void setSeed(byte[] seed)
  {
    secureRandomSpi.engineSetSeed(seed);
  }


  public void setSeed(long seed)
  {
    
    if (secureRandomSpi != null)
    {
      byte tmp[] = { (byte) (0xff & (seed >> 56)),
                     (byte) (0xff & (seed >> 48)),
                     (byte) (0xff & (seed >> 40)),
                     (byte) (0xff & (seed >> 32)),
                     (byte) (0xff & (seed >> 24)),
                     (byte) (0xff & (seed >> 16)),
                     (byte) (0xff & (seed >> 8)),
                     (byte) (0xff & seed)
                   };
      secureRandomSpi.engineSetSeed(tmp);
    }
  }
  public void nextBytes(byte[] bytes)
  {
    randomBytesUsed += bytes.length;
    counter++;
    secureRandomSpi.engineNextBytes(bytes);
  }

  
  protected final int next(int numBits)
  {
    if (numBits == 0)
      return 0;

    byte tmp[] = new byte[numBits / 8 + (1 * (numBits % 8))];

    secureRandomSpi.engineNextBytes(tmp);
    randomBytesUsed += tmp.length;
    counter++;

    int ret = 0;

    for (int i = 0; i < tmp.length; i++)
      ret |= tmp[i] << (8 * i);

    return ret;
  }

  public static byte[] getSeed(int numBytes)
  {
    byte tmp[] = new byte[numBytes];

    new Random().nextBytes(tmp);
    return tmp;
    //return secureRandomSpi.engineGenerateSeed( numBytes );
  }

  public byte[] generateSeed(int numBytes)
  {
    return secureRandomSpi.engineGenerateSeed(numBytes);
  }

}

  }
после чего на него давят RIPEMD-160. и лишь затем мы получаем рзультат вида(ура заточилось и б"ять сломалась)
Возникает вопрос а откуда берётся seed?
А Зернышко друзья мои берётся из Алгоритма Mersenne Twister
Код:
package net.sf.l2j.util;

import java.util.Random;

public class MTRandom extends Random {

      private static final long serialVersionUID = -515082678588212038L;

    private final static int UPPER_MASK = 0x80000000;
    private final static int LOWER_MASK = 0x7fffffff;

    private final static int N = 624;
    private final static int M = 397;
    private final static int MAGIC[] = { 0x0, 0x9908b0df };
    private final static int MAGIC_FACTOR1 = 1812433253;
    private final static int MAGIC_FACTOR2 = 1664525;
    private final static int MAGIC_FACTOR3 = 1566083941;
    private final static int MAGIC_MASK1   = 0x9d2c5680;
    private final static int MAGIC_MASK2   = 0xefc60000;
    private final static int MAGIC_SEED    = 19650218;
    private final static long DEFAULT_SEED = 5489L;

    private transient int[] mt;
    private transient int mti;
    private transient boolean compat = false;

    // Temporary buffer used during setSeed(long)
    private transient int[] ibuf;

       public MTRandom() { }

       public MTRandom(boolean compatible) {
        super(0L);
        compat = compatible;
        setSeed(compat?DEFAULT_SEED:System.currentTimeMillis());
    }

    public MTRandom(long seed) {
        super(seed);
    }

       public MTRandom(byte[] buf) {
        super(0L);
        setSeed(buf);
    }

      public MTRandom(int[] buf) {
        super(0L);
        setSeed(buf);
    }

      private final void setSeed(int seed) {

        
        if (mt == null) mt = new int[N];

        // ---- Begin Mersenne Twister Algorithm ----
        mt[0] = seed;
        for (mti = 1; mti < N; mti++) {
            mt[mti] = (MAGIC_FACTOR1 * (mt[mti-1] ^ (mt[mti-1] >>> 30)) + mti);
        }
        // ---- End Mersenne Twister Algorithm ----
    }

       @Override
 public final synchronized void setSeed(long seed) {
        if (compat) {
            setSeed((int)seed);
        } else {

                      if (ibuf == null) ibuf = new int[2];

            ibuf[0] = (int)seed;
            ibuf[1] = (int)(seed >>> 32);
            setSeed(ibuf);
        }
    }

        public final void setSeed(byte[] buf) {
        setSeed(pack(buf));
    }

      public final synchronized void setSeed(int[] buf) {
        int length = buf.length;
        if (length == 0) throw new IllegalArgumentException("Seed buffer may not be empty");
        // ---- Begin Mersenne Twister Algorithm ----
        int i = 1, j = 0, k = (N > length ? N : length);
        setSeed(MAGIC_SEED);
        for (; k > 0; k--) {
            mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >>> 30)) * MAGIC_FACTOR2)) + buf[j] + j;
            i++; j++;
            if (i >= N) { mt[0] = mt[N-1]; i = 1; }
            if (j >= length) j = 0;
        }
        for (k = N-1; k > 0; k--) {
            mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >>> 30)) * MAGIC_FACTOR3)) - i;
            i++;
            if (i >= N) { mt[0] = mt[N-1]; i = 1; }
        }
        mt[0] = UPPER_MASK; // MSB is 1; assuring non-zero initial array
        // ---- End Mersenne Twister Algorithm ----
    }

      @Override
 protected final synchronized int next(int bits) {
        // ---- Begin Mersenne Twister Algorithm ----
        int y, kk;
        if (mti >= N) {             // generate N words at one time

           

            for (kk = 0; kk < N-M; kk++) {
                y = (mt[kk] & UPPER_MASK) | (mt[kk+1] & LOWER_MASK);
                mt[kk] = mt[kk+M] ^ (y >>> 1) ^ MAGIC[y & 0x1];
            }
            for (;kk < N-1; kk++) {
                y = (mt[kk] & UPPER_MASK) | (mt[kk+1] & LOWER_MASK);
                mt[kk] = mt[kk+(M-N)] ^ (y >>> 1) ^ MAGIC[y & 0x1];
            }
            y = (mt[N-1] & UPPER_MASK) | (mt[0] & LOWER_MASK);
            mt[N-1] = mt[M-1] ^ (y >>> 1) ^ MAGIC[y & 0x1];

            mti = 0;
        }

        y = mt[mti++];

        // Tempering
        y ^= (y >>> 11);
        y ^= (y << 7) & MAGIC_MASK1;
        y ^= (y << 15) & MAGIC_MASK2;
        y ^= (y >>> 18);
        // ---- End Mersenne Twister Algorithm ----
        return (y >>> (32-bits));
    }
    public static int[] pack(byte[] buf) {
        int k, blen = buf.length, ilen = ((buf.length+3) >>> 2);
        int[] ibuf = new int[ilen];
        for (int n = 0; n < ilen; n++) {
            int m = (n+1) << 2;
            if (m > blen) m = blen;
            for (k = buf[--m]&0xff; (m & 0x3) != 0; k = (k << 8) | buf[--m]&0xff);
            ibuf[n] = k;
        }
        return ibuf;
    }
}
после чего состовляется в виртуальной памяти список + и - так сказать к которому во время заточки обращается сервер.
Процент лишь влияет на количество в этом "списке" "минусов" а точнее говоря 0.
Какой можно сделать из этого вывод?
Просчитать "рандом" по такому алгоритму теоретичиески можно но очень трудоёмко, на практике практически невозможно да и проще узнать у администратора сервера рейты заточек.
Например если шанс 75 и макс уровень 50 то заточив 100 вещей вы гарантировано заточите 2 - 3 до 50 уровня .Но это в тепличных условиях, без учёта времени и других игроков которые тоже используют данный "список".
Надеюсь этой статьёй я развею легенды и мифы про просчёт последовательности фейк заточки и прочие танцы с бубном.
DzumoHu4 вне форума   Ответить с цитированием
За это сообщение DzumoHu4 нажился 6 спасибками от:
Старый 05.04.2009, 14:02   #2
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

астрология нас спасет!))
__________________
Я здесь практически не появляюсь!, Skype - ikskor
xkor вне форума   Ответить с цитированием
Старый 05.04.2009, 14:45   #3
Рыцарь
 
Аватар для alexteam
 
Регистрация: 07.03.2009
Сообщений: 9,139
Сказал Спасибо: 70
Имеет 2,820 спасибок в 1,735 сообщенях
alexteam на пути к лучшему
По умолчанию

ога. период этого генератора псевдослучайных 2^219937.
танцуйте с бубном, господа.
__________________
L2Ext - project closed.
alexteam вне форума   Ответить с цитированием
Старый 05.04.2009, 16:15   #5
Местный
 
Регистрация: 11.03.2008
Сообщений: 529
Сказал Спасибо: 10
Имеет 111 спасибок в 71 сообщенях
Xa4ik пока неопределено
По умолчанию

Уже по количеству кода видно что он медленный и в нем есть баги.
Xa4ik вне форума   Ответить с цитированием
Старый 05.04.2009, 16:17   #6
Местный
 
Аватар для KrazyKeNNy
 
Регистрация: 14.06.2008
Сообщений: 163
Сказал Спасибо: 4
Имеет 115 спасибок в 49 сообщенях
KrazyKeNNy пока неопределено
По умолчанию

Лучше всего точить с бубном, стоя на стуле и прыгая на левой ноге, приговаривая:"ааалааахмааа амааахаа", характерно подмигивая сначала одним глазом потом другим с периодом 3 раза в секунду, размахивая руками.
__________________
Американский форум - задаешь вопрос тебе на него отвечают.
Израильский форум - задаешь вопрос тебе отвечают вопросом.
Русский форум - задаешь вопрос и тебе 2 часа объясняют какой ты мудак.
KrazyKeNNy вне форума   Ответить с цитированием
За это сообщение KrazyKeNNy нажился спасибкой от:
Старый 05.04.2009, 17:58   #7
Новичок
 
Регистрация: 16.12.2008
Сообщений: 9
Сказал Спасибо: 16
Имеет 2 спасибок в 2 сообщенях
lexachg пока неопределено
По умолчанию

Цитата:
Сообщение от KrazyKeNNy Посмотреть сообщение
Лучше всего точить с бубном, стоя на стуле и прыгая на левой ноге, приговаривая:"ааалааахмааа амааахаа", характерно подмигивая сначала одним глазом потом другим с периодом 3 раза в секунду, размахивая руками.
это мой способ точения))) я так уже все серва нагинаю)))
lexachg вне форума   Ответить с цитированием
Старый 05.04.2009, 19:26   #8
Новичок
 
Регистрация: 14.11.2008
Сообщений: 6
Сказал Спасибо: 6
Имеет 0 спасибок в 0 сообщенях
Eisbrecher пока неопределено
По умолчанию

Танцы с бубном реально помогают, я заточил дарк скример на 4 !!! Юзайте.
Eisbrecher вне форума   Ответить с цитированием
Старый 05.04.2009, 20:10   #9
Новичок
 
Регистрация: 16.12.2008
Сообщений: 9
Сказал Спасибо: 16
Имеет 2 спасибок в 2 сообщенях
lexachg пока неопределено
По умолчанию

Цитата:
Сообщение от Eisbrecher Посмотреть сообщение
Танцы с бубном реально помогают, я заточил дарк скример на 4 !!! Юзайте.
+5 or nub?
lexachg вне форума   Ответить с цитированием
Старый 06.04.2009, 01:49   #10
Пользователь
 
Аватар для DzumoHu4
 
Регистрация: 28.06.2008
Сообщений: 73
Сказал Спасибо: 7
Имеет 24 спасибок в 16 сообщенях
DzumoHu4 пока неопределено
Смех

Цитата:
Сообщение от Xa4ik Посмотреть сообщение
Уже по количеству кода видно что он медленный и в нем есть баги.
Ну друг мой, если этим кодом пользуются все приложения написанные на Java (и использующие функции псевдослучайных значений) поскольку это стандартный класс, то вряд ли там найдётся хотя бы с десяток багов.
Создатель L2J просто перекрасил в другой цвет раму, велосипед изобрела Sun Microsystems
DzumoHu4 вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Основные форумы > Курилка



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 12:24.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!