главная турниры статьи wiki карта сайта логин

Голосование

Каким бы вы хотели видеть будущее рэндома в Весноте?

Нужно оставить все как есть.
10 (33.3%)
Нужно улучшить качество работы рэндома, т.к. нередко бывают слишком большие перепады.
15 (50%)
Необходимо убрать рэндом вообще.
2 (6.7%)
Неплохо было бы прибавить перепадов в работе рэндома.
1 (3.3%)
Мне все равно.
2 (6.7%)

Проголосовало пользователей: 29

Автор Тема: Рэндом в Весноте.  (Прочитано 8569 раз)

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


ReNoM

  • Администратор
  • level 4
  • *****
  • Сообщений: 782
  • 13-й
  • OS:
  • Linux Linux
  • Browser:
  • Konqueror 4.2.2 Konqueror 4.2.2
    • Просмотр профиля
    • E-mail

  • Раса: Мертвец
Рэндом в Весноте.
« : Апрель 17, 2009, 22:02:41 »
голосуем, а также при желании - пишем свое мнение более развернуто, в этом топике=).
« Последнее редактирование: Февраль 19, 2016, 16:27:17 от ReNoM »

Фликс

  • level 4
  • ****
  • Сообщений: 641
  • Ящер-фалангит
  • OS:
  • Mac OS X 10.5 Mac OS X 10.5
  • Browser:
  • Firefox 3.0.8 Firefox 3.0.8
    • ICQ клиент - 550670854
    • Просмотр профиля
    • E-mail
Re: рэндом в Весноте.
« Ответ #1 : Апрель 17, 2009, 22:29:32 »
Хотелось бы улучшить-что бы не было случаев, когда при 70% мимо все или почти все удары
Убью иль не убью- вот в чём кирпич, его щаз съем, тогда приду к ответу.(с)
---------
Несомненно и ракообразно

WeSS

  • level 1
  • *
  • Сообщений: 57
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Opera 9.64 Opera 9.64
    • Просмотр профиля
Re: рэндом в Весноте.
« Ответ #2 : Апрель 17, 2009, 22:45:07 »
И еще не ясно, 70% это конкретно за один удар берется (т.е. не важно какие были попадания до этого) или это за серию берется? По теории вероятности разница в этом есть, если мне память с универа не изменяет.


ReNoM

  • Администратор
  • level 4
  • *****
  • Сообщений: 782
  • 13-й
  • OS:
  • Linux Linux
  • Browser:
  • Konqueror 4.2.2 Konqueror 4.2.2
    • Просмотр профиля
    • E-mail

  • Раса: Мертвец
Re: рэндом в Весноте.
« Ответ #3 : Апрель 17, 2009, 22:51:04 »
И еще не ясно, 70% это конкретно за один удар берется (т.е. не важно какие были попадания до этого) или это за серию берется? По теории вероятности разница в этом есть, если мне память с универа не изменяет.
за удар.

kalenz

  • level 5
  • *****
  • Сообщений: 904
  • во имя эльфов!
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Microsoft Internet Explorer 7.0 Microsoft Internet Explorer 7.0
    • Просмотр профиля
Re: рэндом в Весноте.
« Ответ #4 : Апрель 17, 2009, 23:20:40 »
за удар?! :o :o :o
но, тогда надо рэндом сделать посмирее! либо я лузер, либо рэндом разошелся! не, подравнять ышо аки надо!
ELV'S ARROWS WILL RAIN!
     ***********
увлекси рыбалкой :)


True

  • Администратор
  • level 2
  • *****
  • Сообщений: 186
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Opera 9.61 Opera 9.61
    • Просмотр профиля
Re: рэндом в Весноте.
« Ответ #5 : Апрель 18, 2009, 00:13:56 »
за удар по идеи
Вероятности тогда по идеи должны вычисляться по схеме Бернули. Но я точно не сравнивал...
Вообще интересно было бы глянуть на то, как у них написан рандом, да только исходники времени рыть нету =((

WeSS

  • level 1
  • *
  • Сообщений: 57
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Opera 9.64 Opera 9.64
    • Просмотр профиля
Re: рэндом в Весноте.
« Ответ #6 : Апрель 18, 2009, 01:54:07 »
Для 1.4.5 есть исходники, вот файлики:
/* $Id: random.cpp 23842 2008-02-16 08:47:16Z mordante $ */
/*
   Copyright (C) 2003 by David White <dave@whitevine.net>
   Copyright (C) 2005 - 2008 by Yann Dirson <ydirson@altern.org>
   Part of the Battle for Wesnoth Project http://www.wesnoth.org/

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License version 2
   or at your option any later version.
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY.

   See the COPYING file for more details.
*/

//! @file random.cpp
//! Generate random numbers.
//!
//! There are various ways to get a random number.
//! rand()              This can be used for things that never are send over the
//!                     network e.g. generate a random map (the final result the
//!                     map is send, but the other players don't need to generate
//!                     the map.
//!
//! get_random()        A random generator which is syncronized over the network
//!                     this only seems to work when it's used by 1 player at the
//!                     same time. It's syncronized after an event so if an event
//!                     runs at two clients at the same time it gets out of sync
//!                     and sets the entire game out of sync.
//!
//! game_state::get_random()
//!                     A random generator which is seeded by the host of an MP
//!                     game. This generator is (not yet) synchronized over the
//!                     network. It's only used by [set_variable]rand=. The map
//!                     designer has to make sure it stays in sync. This
//!                     generator can be used at the same time at multiple client
//!                     since the generators are always in sync.

#include "global.hpp"

#include "config.hpp"
#include "random.hpp"
#include "util.hpp"

#include <cassert>
#include <cstdio>
#include <sstream>

rng::rng() : random_(NULL), random_child_(0)
{}

int rng::get_random()
{
if (!random_)
return rand() & 0x7FFFFFFF;

const config::child_list random(random_->get_children("random"));
if (random_child_ >= random.size()) {
random_child_ = random.size() + 1;
int res = rand() & 0x7FFFFFFF;
(random_->add_child("random"))["value"] = lexical_cast<std::string>(res);
return res;
} else {
return lexical_cast_default<int>((*random[random_child_++])["value"], 0);
}
}

const config* rng::get_random_results()
{
assert(random_ != NULL);

const config::child_list random(random_->get_children("random"));
if (random_child_ <= 0 ||random_child_ > random.size()) return NULL;
return random[random_child_-1]->child("results");
}

void rng::set_random_results(const config& cfg)
{
assert(random_ != NULL);

const config::child_list random(random_->get_children("random"));
if (random_child_ <= 0 || random_child_ > random.size()) return;
random[random_child_-1]->clear_children("results");
random[random_child_-1]->add_child("results",cfg);
}

config* rng::random()
{
return random_;
}

void rng::set_random(config* random)
{
random_ = random;
random_child_ = 0;
return;
}

namespace {
rng* random_generator = NULL;
}

set_random_generator::set_random_generator(rng* r) : old_(random_generator)
{
random_generator = r;
}

set_random_generator::~set_random_generator()
{
random_generator = old_;
}

int get_random()
{
assert(random_generator!=NULL);
return random_generator->get_random();
}

const config* get_random_results()
{
assert(random_generator!=NULL);
return random_generator->get_random_results();
}

void set_random_results(const config& cfg)
{
assert(random_generator!=NULL);
random_generator->set_random_results(cfg);
}
/* $Id: random.hpp 23842 2008-02-16 08:47:16Z mordante $ */
/*
   Copyright (C) 2003 by David White <dave@whitevine.net>
   Copyright (C) 2005 - 2008 by Yann Dirson <ydirson@altern.org>
   Part of the Battle for Wesnoth Project http://www.wesnoth.org/

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License version 2
   or at your option any later version.
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY.

   See the COPYING file for more details.
*/

//! @file random.hpp
//!

#ifndef RANDOM_H_INCLUDED
#define RANDOM_H_INCLUDED

#include "SDL_types.h"

class config;

int get_random();
const config* get_random_results();
void set_random_results(const config& cfg);

class rng
{
public:
rng();
int get_random();

const config* get_random_results();
void set_random_results(const config& cfg);

protected:
config* random();
void set_random(config*);

private:
config* random_;
size_t random_child_;
};

struct set_random_generator {
set_random_generator(rng* r);
~set_random_generator();

private:
rng* old_;
};

#endif

WeSS

  • level 1
  • *
  • Сообщений: 57
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Opera 9.64 Opera 9.64
    • Просмотр профиля
Re: рэндом в Весноте.
« Ответ #7 : Апрель 18, 2009, 02:04:46 »
Вот такая обертка, надо играться с кодом, сами удары находятся в attack_prediction.cpp


True

  • Администратор
  • level 2
  • *****
  • Сообщений: 186
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Opera 9.61 Opera 9.61
    • Просмотр профиля
Re: рэндом в Весноте.
« Ответ #8 : Апрель 18, 2009, 09:16:16 »
вот теперь в принципе понятно как оно работает и откуда берутся ошибки синхронизации xD
много непонятных классов, хз что значат =(
ну юзана стандратная функция rand() видимо...видимо генератор рандома в С++ виноват xD


ReNoM

  • Администратор
  • level 4
  • *****
  • Сообщений: 782
  • 13-й
  • OS:
  • Linux Linux
  • Browser:
  • Konqueror 4.2.2 Konqueror 4.2.2
    • Просмотр профиля
    • E-mail

  • Раса: Мертвец
Re: рэндом в Весноте.
« Ответ #9 : Апрель 18, 2009, 10:27:03 »
там все работает примерно по такой схеме - идет цикл ударов, с количеством итераций, равным максимальному числу ударов между их количеством у атакующего и защищающегося юнита. в теле цикла по очереди считаются попадания атакующего и защищающегося (за исключением случая с наличием специальной возможности атаки - "бьет первым" у защищающегося, насколько можно предположить=) ) следующим образом - есть некоторая вероятность попадания, которая измеряется число от 0 до 99 где-то (не помню точно нижний предел). так вот, генерится рэндомом число в этом диапазоне, и сравнивается с вероятностью. если оно больше вероятности - то засчитывается попадание, иначе промах. если кто-то сдох, цикл заканчивает свою работу досрочно. естественно в этом цикле учитываются все специальные способности юнитов и атак, касающиеся схваток юнитов.

PRO-C@P

  • level 0
  • Сообщений: 11
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Opera 9.63 Opera 9.63
    • Просмотр профиля
    • E-mail
Re: рэндом в Весноте.
« Ответ #10 : Апрель 18, 2009, 11:39:48 »
там все работает примерно по такой схеме - идет цикл ударов, с количеством итераций, равным максимальному числу ударов между их количеством у атакующего и защищающегося юнита. в теле цикла по очереди считаются попадания атакующего и защищающегося (за исключением случая с наличием специальной возможности атаки - "бьет первым" у защищающегося, насколько можно предположить=) ) следующим образом - есть некоторая вероятность попадания, которая измеряется число от 0 до 99 где-то (не помню точно нижний предел). так вот, генерится рэндомом число в этом диапазоне, и сравнивается с вероятностью. если оно больше вероятности - то засчитывается попадание, иначе промах. если кто-то сдох, цикл заканчивает свою работу досрочно. естественно в этом цикле учитываются все специальные способности юнитов и атак, касающиеся схваток юнитов.
Ты уверен? Если это так то получается слишком большое расхождение.Мне кажется стоит сделать 0-9 а шансы поделить на 10 и сравнивать.Тогда получится более прогнозируемо.


ReNoM

  • Администратор
  • level 4
  • *****
  • Сообщений: 782
  • 13-й
  • OS:
  • Linux Linux
  • Browser:
  • Konqueror 4.2.2 Konqueror 4.2.2
    • Просмотр профиля
    • E-mail

  • Раса: Мертвец
Re: рэндом в Весноте.
« Ответ #11 : Апрель 18, 2009, 12:50:29 »
там все работает примерно по такой схеме - идет цикл ударов, с количеством итераций, равным максимальному числу ударов между их количеством у атакующего и защищающегося юнита. в теле цикла по очереди считаются попадания атакующего и защищающегося (за исключением случая с наличием специальной возможности атаки - "бьет первым" у защищающегося, насколько можно предположить=) ) следующим образом - есть некоторая вероятность попадания, которая измеряется число от 0 до 99 где-то (не помню точно нижний предел). так вот, генерится рэндомом число в этом диапазоне, и сравнивается с вероятностью. если оно больше вероятности - то засчитывается попадание, иначе промах. если кто-то сдох, цикл заканчивает свою работу досрочно. естественно в этом цикле учитываются все специальные способности юнитов и атак, касающиеся схваток юнитов.
Ты уверен? Если это так то получается слишком большое расхождение.Мне кажется стоит сделать 0-9 а шансы поделить на 10 и сравнивать.Тогда получится более прогнозируемо.
уверен, т.к. смотрел исходники. правда 1.4.* версии.
не понял мысли. что изменится, если мы все поделим на 10?


True

  • Администратор
  • level 2
  • *****
  • Сообщений: 186
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Opera 9.61 Opera 9.61
    • Просмотр профиля
Re: рэндом в Весноте.
« Ответ #12 : Апрель 18, 2009, 18:24:21 »
ReNoM
ну это разумно...)

WeSS

  • level 1
  • *
  • Сообщений: 57
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Opera 9.64 Opera 9.64
    • Просмотр профиля
Re: рэндом в Весноте.
« Ответ #13 : Апрель 19, 2009, 02:20:19 »
Еще зависит как инициализируется... Вообще на быстрый глаз там практически стандартный rand() в плане своей кривой псевдовероятности. Потому что я его последовательности нутром чую по игре, уж слишком он "псевдо", а судя по коду ничего вносящего туда большое разнобразие случайными событиями нет.
 
Цитировать
если оно больше вероятности - то засчитывается попадание, иначе промах.
Не наверное наоборот, если меньше? Ну вероятность 70%, значит надо считать все что меньше 70 попаданием, иначе она получится как 30%.


True

  • Администратор
  • level 2
  • *****
  • Сообщений: 186
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Opera 9.61 Opera 9.61
    • Просмотр профиля
Re: рэндом в Весноте.
« Ответ #14 : Апрель 19, 2009, 10:10:13 »
WeSS
насчёт кривой псевдовероятности не замечал.
Да, инициализация. Ну я думаю там где нибудь, да инициализатор генератора рандома стоит.
Ну псевдорандом он и есть псевдорандом. С одинаковым входом будет одинаковый выход.
Можно брать такие параметры, как имя компьютера, свободное место на диске, даже положение курсора мыши =)