{{notification.text}}

MirGames

22.08.09 00:45
0
Привет. Ребят помогите я голову сломал. Мне надо перевести на С++ с Delphi следующее:

randomize;
x := (random(1000000000)-500000000+1)/10000000;
y := (random(1000000000)-500000000+1)/10000000;
z := (random(1000000000)-500000000+1)/10000000;


Получается чтото вроде:


srand(time(NULL));
x =((rand()%1000000000+1)-500000000);
y =((rand()%1000000000+1)-500000000);
z =((rand()%1000000000+1)-500000000);


Этот код должен размещать 1000 шариков в 3D пространстве. Но НЕТ написанный на С++ он размещает не в диапазоне от -50 до +50 а хз как вообще. Все объекты в 1 точке. Помогите плиз я думаю чтото нетак в этой rand().
Отредактировано: 22.08.09 00:45
#1
22.08.09 00:52
0
Вот весь код на всякий случай.


Цитата

#include <iostream>
#include <Irrlicht.h>
#include "stdafx.h"

#pragma comment(lib,"Irrlicht.lib")

#define Count 1000
#define Ms 1.98892E32
#define G 6.67E-11

using namespace irr;
using namespace core;
using namespace video;
using namespace scene;
using namespace std;

class Dust// Наши притягиваемые объекты.
{
public:
float x,y,z;// Положение.
float sx,sy,sz;// Скорость;
IAnimatedMesh *Mesh;// Сетка.
IAnimatedMeshSceneNode *node;// Объект для отображения сетки.
};

class MyEventReceiver : public IEventReceiver// Нашь ресивер.
{
public:
// This is the one method that we have to implement
virtual bool OnEvent(const SEvent& event)
{
// Remember whether each key is down or up
if (event.EventType == irr::EET_KEY_INPUT_EVENT)
KeyIsDown[event.KeyInput.Key] = event.KeyInput.PressedDown;

return false;
}

// This is used to check whether a key is being held down
virtual bool IsKeyDown(EKEY_CODE keyCode) const
{
return KeyIsDown[keyCode];
}

MyEventReceiver()
{
for (u32 i=0; i<KEY_KEY_CODES_COUNT; ++i)
KeyIsDown[i] = false;
}

private:
// We use this array to store the current state of each key
bool KeyIsDown[KEY_KEY_CODES_COUNT];
};

Dust *Dusts[Count];// Массив камней.

void gravi(const f32 deltaTime)// Воздействие гравитацией.
{
int i;
float dx, dy, dz, gm;
for (i=0;i<=Count;i++)
{
// Двигаем все.
Dusts[i]->x = Dusts[i]->x + (Dusts[i]->sx*deltaTime)/1E5;
Dusts[i]->y = Dusts[i]->y + (Dusts[i]->sy*deltaTime)/1E5;
Dusts[i]->z = Dusts[i]->z + (Dusts[i]->sz*deltaTime)/1E5;
// Применяем положение.
Dusts[i]->node->setPosition(vector3df(Dusts[i]->x,Dusts[i]->y,Dusts[i]->z));
}
}

int main()
{
int i;

MyEventReceiver reciever;// Переменная нашего ресивера.

// Получаем указатели на драйвера и создаем устройства.
IrrlichtDevice *Device = createDevice(EDT_OPENGL, dimension2d<s32>(800, 600), 32, false, false);
IVideoDriver *Driver = Device->getVideoDriver();
ISceneManager *sManager = Device->getSceneManager();

// Загружаем сетки.
srand(time(NULL));
for (i = 0; i <= Count; i++)
{
float x,y,z;
Dusts[i] = new Dust;
Dusts[i]->Mesh = sManager->getMesh("Object.3ds");

x =((rand()%100000)-50000)/1000;
y =((rand()%100000)-50000)/1000;
z =((rand()%100000)-50000)/1000;

Dusts[i]->x = x;
Dusts[i]->y = y;
Dusts[i]->z = z;

Dusts[i]->sx = (rand()%80000)-40000;
Dusts[i]->sy = (rand()%80000)-40000;
Dusts[i]->sz = (rand()%80000)-40000;

Dusts[i]->node = sManager->addAnimatedMeshSceneNode(Dusts[i]->Mesh);

Dusts[i]->node->setPosition(vector3df(x,y,z));
}

// Создаем камеру.
ICameraSceneNode *Camera = sManager->addCameraSceneNode(0,vector3df(0,50,30),vector3df(0,0,0));
ILightSceneNode *Light = sManager->addLightSceneNode(0,vector3df(30,30,30),SColor(255,255,255,255),1000);

// Переменная для просчета дельта тайма.
u32 sTime = Device->getTimer()->getTime();

// Рисуем сцену.
while (Device->run())
{
const f32 fTime = Device->getTimer()->getTime();
const f32 deltaTime = (fTime - sTime)/1000.f;// Просчитываем дельтатайм.
sTime = sTime;

Driver->beginScene(true,true,SColor(200,200,200,200));
sManager->drawAll();
gravi(deltaTime);
core::stringw tmp;
int fps = Driver->getFPS();
tmp += fps;
Device->setWindowCaption(tmp.c_str());
Driver->endScene();
}
Device->drop();
return 0;
}


#2
22.08.09 01:07
0
Цитата
Но НЕТ написанный на С++ он <...>. Помогите плиз я думаю чтото нетак в этой rand().

А делить на 10000000 не нужно? C++ это сам должен сделать?
Отредактировано: 22.08.09 01:10
#3
22.08.09 01:13
0
Цитата(visual @ 21.08.2009 - 21:07) [snapback]97573[/snapback]

А делить на 10000000 не нужно? C++ это сам должен сделать?

ТЫк я делю и всеравно) Я же говорю делаю: ((rand()1000 000 000) - 500 000 000)/10 000 000;


То что я щас представил как код программы немного изменен но даже при написании так как я щас сделал всеравно что то нето получается.

Разве так не прально?:

x =((rand()%100000)-50000)/1000;
y =((rand()%100000)-50000)/1000;
z =((rand()%100000)-50000)/1000;
Отредактировано: 22.08.09 01:15
#4
22.08.09 03:46
0
Battlemakc
Ты учитываешь разницу между целочисленным делением и float-ным? Нужно к float явно приводить.

А насчет
Цитата
ТЫк я делю и всеравно) Я же говорю делаю: ((rand()1000 000 000) - 500 000 000)/10 000 000;

Нифига, перепрочти свой первый пост:
Цитата
srand(time(NULL));
x =((rand()%1000000000+1)-500000000);
y =((rand()%1000000000+1)-500000000);
z =((rand()%1000000000+1)-500000000);
Отредактировано: 22.08.09 03:47
#5
22.08.09 17:29
0
Цитата(visual @ 21.08.2009 - 23:46) [snapback]97577[/snapback]

Battlemakc
Ты учитываешь разницу между целочисленным делением и float-ным? Нужно к float явно приводить.

А насчет

Нифига, перепрочти свой первый пост:


:) Точно. Эт там так, но в программе там все путем. Щас пробну привести к др типу.
#6
22.08.09 17:42
0
Вот блин. У меня в книге ничего нету про приведение типов. Сделай одолжение объясни тупому чайнику как оно работает, а то в нете только примеры и никакого разжевывания нету. Заранее благодарен) :blush:
#7
22.08.09 17:48
0
Код
#include <stdio.h>

int main()
{
  float f = 1756/1000; // выполнит операцию как div в delphi
  printf("%f\n", f);
  f = (float)1756/(float)1000; // выполнит дробное деление
  printf("%f\n", f);
  return 0;
}

#8
22.08.09 18:06
0
Цитата(visual @ 22.08.2009 - 13:48) [snapback]97592[/snapback]

Код
#include <stdio.h>

int main()
{
  float f = 1756/1000; // выполнит операцию как div в delphi
  printf("%f\n", f);
  f = (float)1756/(float)1000; // выполнит дробное деление
  printf("%f\n", f);
  return 0;
}



Спс. Это и есть приведение типов?
#9
22.08.09 18:20
0
x =((float)(rand()%1000000000-500000000))/(float)10000000;


<_< <_< <_< Ниче не работает все тоже самое!

Я разочароан в С++ :wacko:


P.S. Выдает значения от -49.9950 до -50 почему!?!??! Чтото я психовать начинаю уже. Как бы не заругатцо... :angry:
Отредактировано: 22.08.09 18:45
#10
22.08.09 18:50
0
Battlemakc
А учитываешь ли ты, что rand() возвращает значение от 0 до RAND_MAX? И само значение RAND_MAX?
#11
22.08.09 18:53
0
Аа. Точно. Хм. И что это значит?
#12
22.08.09 18:54
0
У меня, например, RAND_MAX == 32767.
#13
22.08.09 18:55
0
ТЫ мне скажи что делать надо )

Черт и что делать-то если надо большую точность получить!?
Отредактировано: 22.08.09 18:56
#14
22.08.09 18:59
0
Например, вызывать rand() дважды, скажем так
Код
int drand()
{
  return rand() << 16 + rand();
}


А, вообще, думаю, что гугл лучше меня знает как решается эта типичная проблема.
#15
22.08.09 19:00
0
О май гайребал у меня тоже(((


Спс пробну)
#16
22.08.09 19:09
0
Блииин. Проблема в том что в гугле ниче нету по этой теме там всякая ерунда. Проблема еще в том, что вызвать ранд мне надо не 2 раза а 10 000 это ваще блин нафик даже незнаю((((((((((( Помогите!

return rand()*100000 + rand()*10000 + rand()*1000 + rand()*100 + rand()*10; тож нето( Может свой генератор придумать?


**************
Давайте соберемся и реально напишем генератор случайных чисел в диапазоне от 0 до 1000 000 000 000

или -500 000 000 000 до +500 000 000 000 ^_^
Отредактировано: 22.08.09 19:15
#17
22.08.09 21:25
0
Так, а теперь объясни мне чем тебе не понравилось это решение?

Цитата
Давайте соберемся и реально напишем генератор случайных чисел в диапазоне от 0 до 1000 000 000 000
или -500 000 000 000 до +500 000 000 000 happy.gif

Зачем тратить на это время, когда обычный способ работает?
#18
23.08.09 03:58
0
Хехе, только что я понял, что код выше не совсем верный. Вот так лучше
Код
unsigned drand()
{
  return rand() << 16 + rand();
}
Отредактировано: 23.08.09 03:58
#19
23.08.09 05:37
0
В Си не силён. Сделал бы так:
Код

#include <iostream>

int randrange(int min, int max) {
   return rand() / (float)RAND_MAX * (max - min) + min;
}

int main() {
    srand(time(NULL));
    for (int i = 0; i < 1000; i++)
        printf("%d \n", randrange(-500000000, +500000000));
    return 0;
}
Отредактировано: 23.08.09 05:38
#20
fatality
25.08.09 01:22
0
battlemakc
если тебе нужно число в диапозоне от -50 до 50, то можно сделать так:
int a=rand()%101-50;
float b=a/100.0;
return b;
#{{post.Index}}
{{post.Author.Login}}
{{post.CreatedDate | date:'dd.MM.yy HH:mm'}}
{{post.VotesRating}}
Отредактировано: {{post.UpdatedDate | date:'dd.MM.yy HH:mm'}}