• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program nie przekracza wartości 32768

VPS Starter Arubacloud
0 głosów
207 wizyt
pytanie zadane 29 kwietnia 2018 w C i C++ przez Janusz92 Bywalec (2,150 p.)

Witam,

Próbuję wygenerować proste dane reprezentujące strukturę grafu skierowanego. Problem polega na tym, iż przy ustawieniu ilości wierzchołków większej niż 32768, skrypt i tak wygeneruje maksymalny wierzchołek jako właśnie 32768. Rozumiem, że to wartość maksymalna int, lecz nie wiem w jaki sposób to zmienić. W skrypcie całość zapisywana jest do pliku. Zmienna odpowiedzialna za ilość wierzchołków to NUM, w poniższym kodzie ustawiona na 40000.

Pierwszy wiersz zapisywany to pliku do kolejno: minimalny wierzchołek, maksymalny wierzchołek, ilość krawędzi.

Jak przewinie się wygenerowany plik na sam koniec to minimalny wierzchołek kończy się na 32768, a powinien na 40000.

Przykładowy output z poniższego kodu (skrócony, zawiera tylko początek i koniec): https://pastebin.com/raw/c4Xp7wBC

Z góry dziękuję za pomoc.

Kod:

// A C++ Program to generate test cases for
// a weighted directed graph
#include<bits/stdc++.h>
#include<stdio.h>

using namespace std;

// Define the number of runs for the test data
// generated
#define RUN 1

// Define the maximum number of vertices of the graph
#define MAX_VERTICES 50000

// Define the maximum number of edges
#define MAX_EDGES 100000

// Define the maximum weight of edges
#define MAXWEIGHT 50

int main()
{
	set<pair<int, int> > container;
	set<pair<int, int> >::iterator it;

	// Uncomment the below line to store
	// the test data in a file
	freopen("test.txt", "w", stdout);

	// For random values every time
	srand(time(NULL));

    int START = 1; // Start vertex
	int NUM; // Number of Vertices
	int NUMEDGE; // Number of Edges

	for (int i=1; i<=RUN; i++)
	{
		// NUM = 1 + rand() % MAX_VERTICES;
        NUM = 40000;
		// Define the maximum number of edges of the graph
		// Since the most dense graph can have N*(N-1)/2 edges
		// where N = n number of vertices in the graph
		// NUMEDGE = 1 + rand() % MAX_EDGES;
        NUMEDGE = 100000;

		while (NUMEDGE > NUM*(NUM-1)/2)
			NUMEDGE = 1 + rand() % MAX_EDGES;

		// First print the number of vertices and edges
		printf("%d %d %d\n", START, NUM, NUMEDGE);

		// Then print the edges of the form (a b)
		// where 'a' is connected to 'b'
		for (int j=1; j<=NUMEDGE; j++)
		{
			int a = 1 + rand() % NUM;
			int b = 1 + rand() % NUM;
			pair<int, int> p = make_pair(a, b);

			// Search for a random "new" edge every time
			// Note - In a tree the edge (a, b) is same
			// as the edge (b, a)
			while (container.find(p) != container.end())
			{
				a = 1 + rand() % NUM;
				b = 1 + rand() % NUM;
				p = make_pair(a, b);
			}
			container.insert(p);
		}

		for (it=container.begin(); it!=container.end(); ++it)
		{
			int wt = 1 + rand() % MAXWEIGHT;

			printf("%d %d %d\n", it->first, it->second, wt);
		}

		container.clear();
		// printf("\n");

	}

	// Uncomment the below line to store
	// the test data in a file
	fclose(stdout);
	return(0);
}

 

1 odpowiedź

+1 głos
odpowiedź 29 kwietnia 2018 przez niezalogowany
wybrane 29 kwietnia 2018 przez Janusz92
 
Najlepsza

Wartość maksymalna int jest znacznie większa. Problem leży gdzieś indziej. Największa możliwa liczba wylosowana przy pomocy rand() wynosi 32767 (w kodzie masz dodatkowe +1). Od C++11 powinieneś używać random:

#include <random>
#include <iostream>
 
int main()
{
    std::random_device rd;  //Will be used to obtain a seed for the random number engine
    std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
    std::uniform_int_distribution<> dis(1, 6);
 
    for (int n=0; n<10; ++n)
        //Use dis to transform the random unsigned int generated by gen into an int in [1, 6]
        std::cout << dis(gen) << ' ';
    std::cout << '\n';
}

Przykładowa nowa funkcja do losowania intów z całego zakresu:

#include <iostream>
#include <random>

thread_local std::mt19937 gen{ std::random_device{}() };

int randint(int min, int max) {
    return std::uniform_int_distribution<int>{min, max}(gen);
}

int main()
{
    std::cout << randint(0, 400000);
}
komentarz 29 kwietnia 2018 przez Janusz92 Bywalec (2,150 p.)
W tym był problem, dzięki :)

Podobne pytania

0 głosów
0 odpowiedzi 94 wizyt
pytanie zadane 14 listopada 2022 w HTML i CSS przez MacGyver Nowicjusz (120 p.)
0 głosów
1 odpowiedź 220 wizyt
pytanie zadane 28 grudnia 2021 w Java przez xFanti Obywatel (1,350 p.)
0 głosów
0 odpowiedzi 496 wizyt
pytanie zadane 23 kwietnia 2021 w C i C++ przez Mavimix Dyskutant (8,390 p.)

92,454 zapytań

141,262 odpowiedzi

319,091 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...