Permalänk
Medlem

C++ fråga om rand(), m.m.

Hej,
Har precis planerat att ta upp C++ programmering igen, sisst jag höll på med det var i en gymnasiekurs för 2 år sen.
Så jag försöker för tillfället få dett att simulera en tärning igenom

tarning = rand() % 6 + 1;

det som händer dock när jag kör det är att det alltid vissar samma siffra hur jag än gör. Gör jag flera olika tärningar så vissar dom olika siffror, allt från 0-6(även om det inte ska vara möjligt att få 0). så någon som vet vad jag gör för fel här?

Sen tänkte jag även kolla om någon vet ett bra sätt att kolla om 3 tärningar av 5 är lika (tänk yatzi). Har försökt komma på flera sätt men ingen av dom har fungerat riktigt, det ända sättet jag vet är att testa alla kombinationer av tärningar men tror nog det finns ett enklare sätt?

Om det spelar någon roll så programmerar jag detta i visual basic, och kör det som en kommandotolk/cmd.

Permalänk
Medlem

Vet inte om det är den bästa lösningen men lägg till:
#include <ctime>

i början och sedan kör:

srand(time(0));

i början av programmet.

EDIT:
Gjorde ett yatzi i ada för några år sedan. Jag gjorde så att jag skapade en array av ints med 6 platser (int kvant[6]) som sedan fick representera hur många tärningar av ett visst slag det fanns. T ex kvant[0] == 3 innebär att man har fått tre ettor. (kvant[0] == 3 && kvant[1] == 2) innebär att du har fått kåk med ettor och tvåor, osv.

Visa signatur
Permalänk
Medlem

tackar, funka med srand(time(0)); även om jag inte har en arning om varför och vad det gör :).

och kvant array lösningen värkar intressant. Hör gärna fler förslag hur man kan göra det på. om det finns så många sätt <.<

Permalänk
Medlem

Slumptal är egentligen inte slumpade (vanligtvis i alla fall). Det är lite som att man har en stor lista med en massa nummer och så plockar datorn bara talen i tur och ordning. Genom att "seeda" slumptalsgeneratorn (vilket är srand(seed) gör) så gör du något som kan liknas med att välja en rad i listan att börja på. Det är vanligt att använda just den nuvarande tiden (time(0)) för att seeda eftersom den skiljer sig mellan körningar av programmet, vilket ger olika sekvenser av slumptal. Väljer man samma seed mellan två körningar så får man samma slumptal.

Permalänk
Medlem
Skrivet av Thomas H:

Slumptal är egentligen inte slumpade (vanligtvis i alla fall). Det är lite som att man har en stor lista med en massa nummer och så plockar datorn bara talen i tur och ordning. Genom att "seeda" slumptalsgeneratorn (vilket är srand(seed) gör) så gör du något som kan liknas med att välja en rad i listan att börja på. Det är vanligt att använda just den nuvarande tiden (time(0)) för att seeda eftersom den skiljer sig mellan körningar av programmet, vilket ger olika sekvenser av slumptal. Väljer man samma seed mellan två körningar så får man samma slumptal.

med time eller seed så startar du en klocka som hela tiden går igenom "slumptalslistan" och gör det hela lite mer slumpigt än när den tar nummrena i tur o ordning

Visa signatur

ATX sys i micro-atx chassi -> Ace ecco-220 | Intel Q9550 @ 3,8 w/ 620 + GT 1850 | HIS 6970-Antec 620 mod w/ GT 1850 | 4x2gb OCZ reaper 1150mhz | Corsair 750tx | m4 128gb | W7 ulti 64

Laptop Acer 3820TG | i5 450m | 5650 | Intel G3 160gb

Permalänk
Medlem

Vad snackar du om? time() hämtar bara ut en numerisk representation av den nuvarande tidpunkten som ger ett någorlunda unikt seed-värde mellan körningar. Det ligger väl ingen timer bakom och kör? Stoppar du in samma seed så får du samma sekvens, antagligen med hjälp av en deterministisk hash- eller krypteringsalgoritm.

Permalänk
Skrivet av Thomas H:

Vad snackar du om? time() hämtar bara ut en numerisk representation av den nuvarande tidpunkten som ger ett någorlunda unikt seed-värde mellan körningar. Det ligger väl ingen timer bakom och kör? Stoppar du in samma seed så får du samma sekvens, antagligen med hjälp av en deterministisk hash- eller krypteringsalgoritm.

+1. Thomas har rätt.

Permalänk
Medlem

Datorer brukar nästan alltid generera pseudo random numbers. Alltså inte äkta slumpade tal. Detta hänger samman med datorns deterministiska natur.
Detta har ibland utnyttjats i multispelarspel, där man kunnat göra "skenhändelser" tills dess att man f¨r en "slumphändelse" som man vill använda. T.ex. se till att varje träff i WoW crittar eller så.

Permalänk
Medlem
Skrivet av Oldskool:

Datorer brukar nästan alltid generera pseudo random numbers. Alltså inte äkta slumpade tal. Detta hänger samman med datorns deterministiska natur.
Detta har ibland utnyttjats i multispelarspel, där man kunnat göra "skenhändelser" tills dess att man f¨r en "slumphändelse" som man vill använda. T.ex. se till att varje träff i WoW crittar eller så.

Vadå nästan alltid? Enda sättet att inte generera pseudoslumptal är att koppla din dator till en geigermätare (typ).

Permalänk
Medlem

Måste säga att detta faktist är ganksa intressant(dags att söka lite mer info), iallfall för mig som alldrig hört talas om detta
Passar på att ställer några frågor, vad menas med seed/seed-värde?
och vad menas med hela meningen "datorn tar nummrena i tur o ordning", är det inte meningen att rand() ska göra så datorn randomizar talen?

Permalänk
Medlem

Varje nytt "slump"-tal genereras utifrån det föregående talet via ett matematiskt uttryck. Sekvensen av värden är alltså i någon mening förutbestämd. Det kan liknas vid att man plockar i tur och ordning från en lista med slumptal, men det är alltså inte så det fungerar i praktiken.

Seed-värdet är det som används för den första beräkningen. Om man alltid använder samma seed (t ex genom att inte anropa srand()) så får man alltid samma sekvens.

Permalänk
Medlem
Skrivet av Thomas H:

Vad snackar du om? time() hämtar bara ut en numerisk representation av den nuvarande tidpunkten som ger ett någorlunda unikt seed-värde mellan körningar. Det ligger väl ingen timer bakom och kör? Stoppar du in samma seed så får du samma sekvens, antagligen med hjälp av en deterministisk hash- eller krypteringsalgoritm.

Var så jag minns att min programmeringslärare förklarade det, att programmet då går igenom talen och tar det tal som den står på när funktionen utnyttjas. Hm det finns flera olika metoder att "slumpa" med, kanske var så fast inte med just den det talas om nu? Kan ha varit med visual basic det utfördes så på. Eller så sa han något för att förenkla det hela då vi inte direkt var i steget att skapa egna metoder att slumpa tal på, hade inte ens börjat med menyer i c++ då och kursen slutade vid just det.

Visa signatur

ATX sys i micro-atx chassi -> Ace ecco-220 | Intel Q9550 @ 3,8 w/ 620 + GT 1850 | HIS 6970-Antec 620 mod w/ GT 1850 | 4x2gb OCZ reaper 1150mhz | Corsair 750tx | m4 128gb | W7 ulti 64

Laptop Acer 3820TG | i5 450m | 5650 | Intel G3 160gb

Permalänk
Medlem

Tja, inte för att jag är expert på området, men jag har då inte hört talas om någon slumptalsgenerator som använder en timer. De flesta jag har hört talas om är kryptografiska, och den enda jag har sett i detalj var en implementation av en HMAC algoritm.

Permalänk
Medlem
Skrivet av You:

Vadå nästan alltid? Enda sättet att inte generera pseudoslumptal är att koppla din dator till en geigermätare (typ).

Hardware random number generator - Wikipedia, the free encyclopedia

Visa signatur

Assembly är ett högnivåspråk.

Permalänk
Skrivet av You:

Vadå nästan alltid? Enda sättet att inte generera pseudoslumptal är att koppla din dator till en geigermätare (typ).

I moderna kärnor så hämtar man entropi från flera olika källor. Läs till exempel
Entropy (computing) - Wikipedia, the free encyclopedia

PRNG:s används i sådana system för att "dryga ut" den riktigt slumpmässiga datan eftersom det ofta är svårt att få tillräckligt mycket sådan.

Permalänk
Medlem
Skrivet av jop_the_jopsan:

I moderna kärnor så hämtar man entropi från flera olika källor. Läs till exempel
Entropy (computing) - Wikipedia, the free encyclopedia

PRNG:s används i sådana system för att "dryga ut" den riktigt slumpmässiga datan eftersom det ofta är svårt att få tillräckligt mycket sådan.

Entropi är dock inte slumpmässig på riktigt utan hämtas från deterministiska indata. Hårdvaru-RNGs är i princip det enda som gäller; och då handlar det i princip alltid om någon sorts sönderfall eller kvantslumpmässighet. Man kan plocka från universums bakgrundsbrus också, men det är tveksamt om det är slumpmässigt "på riktigt".

Permalänk
Testpilot
Skrivet av Antzo:

Var så jag minns att min programmeringslärare förklarade det, att programmet då går igenom talen och tar det tal som den står på när funktionen utnyttjas.

srand används bara för att sätta starten på listan av slumptal och du kan skicka in vilket tal som helst. time är en funktion som returnerar den nuvarande tiden som ett heltal och passar då rätt bra att stoppa in i srand för att på så vis få olika startpunkter varje gång programmet körs (förutsatt att tidpunkten har ändrats, två program som körs inom samma sekund kommer få samma slumplista eftersom time ger samma heltal).

time ger ett helt vanligt heltal (1291044676 just nu när jag skriver) och det praktiska med funktionen är att resultatet förändras över tiden, skriver du istället srand(1291044676) först i ditt program kommer du alltid få samma resultat varje gång programmet körs.

Visa signatur

Kolla gärna in min RGB-LED-ljusstake i galleriet
[Gigabyte GA-Z97MX-Gaming 5][Intel Core i5 4690K][Corsair XMS3 16GB][Asus GeForce RTX 2060 Super Dual Evo OC]