Zufallszahlen

» Siedler Map Source Forum » Siedler DEdK Script Forum » Zufallszahlen

Seiten: 1

Fire_Bird
#1
22.02.2015 13:19
Beiträge: 719

Zufallszahlen

Hallo,

Ich habe in meiner Map in der FMA als ersten Befehl

math.randomseed(XGUIEng.GetSystemTime())

stehen.
Wenn ich jetzt aber mit

local ranPosNum = math.random(1,10)

einen Zufallswert haben will, bekomm ich immer die selben Werte...

Was mache ich falsch?

Fire_Bird

Peter-FS
#2
22.02.2015 14:30
Beiträge: 1086

GetSystemTime gibt die Laufzeit der Siedler.exe in Sekunden wieder.
d.h. wenn du neu startest, bekommst du immer ca. die gleiche Zeit zurück.
Ich mulitpliziere die Zahl immer:
math.randomseed(XGUIEng.GetSystemTime()*9132)

Probiers mal aus.

Gruss Peter

____________________
Man muss nicht alles wissen, man muss nur wissen wo es steht!

yoq
#3
22.02.2015 14:59
Beiträge: 91

Nimm einfach das aktuelle Datum+Zeit zum Seed:

function InitRand()
    local seed = XGUIEng.GetSystemTime()
    string.gsub(Framework.GetSystemTimeDateString(), "%d+", function(n)seed=seed*n;end)
    math.randomseed(seed)
end



____________________
S5 & S6: Lua Script Debugger (Thread) | bbaTool
S5: S5Hook (Thread) | S5 GUI Editor | S5 Grafikupgrade + nVidia fix | Win10 Creators Update

Fire_Bird
#4
22.02.2015 15:54
Beiträge: 719

Danke, geht nun deutlich besser

totalwarANGEL
#5
22.02.2015 22:03
Beiträge: 2123

Oder du sorgst einfach dafür, dass die Zufallsbasis zu einem bestimmten Punkt in der Handlung erstellt wird. Jeder Spieler wird i.d.R. zu einem etwas anderen Zeitpunkt in der Handlung so weit fortgeschritten sein. Dann reicht ein simples Logic.GetTimeMs

____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.

wilma456
#6
23.02.2015 13:21
Beiträge: 460

Klick hier und scroll runter zum Beitrag von mcb.

____________________
Schlacht um Crawford

Wilmasmod

mcb
#7
23.02.2015 14:29
Beiträge: 1472

@wilma: GetRandom stammt nicht von mir.

Ich hab aber auch eine für mich angepasste Version:

--- GetRandom   mcb  1.0    (Original ???)  
-- Gibt eine Pseudozufallszahl zwischen _min und _max zurück.  
-- Ist _max nicht gesetzt, zwischen 1 und _min.  
-- Wird ein numerisches table übergeben, wird ein pseudozufälliger Eintrag zurückgegeben.  
-- 
-- Benötigt:
-- nix
function GetRandom(_min, _max)
	if type(_min)=="table" then
		return _min[GetRandom(table.getn(_min))]
	end
	if not _max then
		_max = _min
		_min = 1
	end
	if not gvRandomseed then
		gvRandomseed = true
		local seed = XGUIEng.GetSystemTime()
		local str = Framework.GetSystemTimeDateString()
		for i=1, string.len(str) do
			seed = seed * string.byte(str, i, i)
		end
		math.randomseed(seed)
	end
	assert(type(_min)=="number" and type(_max)=="number")
	return math.random(_min, _max)
end

AdeBont
#8
24.02.2015 21:12
Beiträge: 666

I'm just using math.random, work perfect, every time another value returned.

____________________
AdB
---------------------------------
Now faith is the substance of things hoped for,
the evidence of things not seen.
Heb 11:1

Play4FuN
#9
26.02.2015 18:58
Beiträge: 704

In this case it doesnt primary matter if the next random number is different! In our issue its about getting a different seed for each game. Because if you note down some random numbers in one game, quit and start the same map again you dont want to have the same values like in the last game. Got it?

Randomly created numbers arent so effective when they are the same every time you start the map

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

Seiten: 1

SiteEngine v1.5.0 by nevermind, ©2005-2007
Design by SpiderFive (www.siedler-games.de) - English translation by juja

Impressum