<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Kombinationsmöglichkeiten]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich suche einen Algorithmus um aus aus einer Menge von Objekten mögliche Kombinationsmöglichkeiten zu finden. Zum Beipiel: Lotto 6 aus 49.</p>
<p>Oder überschaubarer: Es gibt 5 Spieler: a,b,c,d,e<br />
Vier von den Personen sollen als Spieler eingesetzt werden. Welche Kombinationsmöglichkeiten sind möglich? Lösung:<br />
a,b,c,d<br />
b,c,d,e<br />
c,d,e,a<br />
d,e,a,b<br />
a,b,c,e</p>
<p>Mit dem Binomialkoeffizient kann man die Anzahl der Kombinationen berechnen. Wie aber kann ich mögliche Kombinationen auslisten?</p>
<p>Danke<br />
Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/302570/kombinationsmöglichkeiten</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 06:50:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/302570.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 22 Apr 2012 11:21:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kombinationsmöglichkeiten on Sun, 22 Apr 2012 11:21:02 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich suche einen Algorithmus um aus aus einer Menge von Objekten mögliche Kombinationsmöglichkeiten zu finden. Zum Beipiel: Lotto 6 aus 49.</p>
<p>Oder überschaubarer: Es gibt 5 Spieler: a,b,c,d,e<br />
Vier von den Personen sollen als Spieler eingesetzt werden. Welche Kombinationsmöglichkeiten sind möglich? Lösung:<br />
a,b,c,d<br />
b,c,d,e<br />
c,d,e,a<br />
d,e,a,b<br />
a,b,c,e</p>
<p>Mit dem Binomialkoeffizient kann man die Anzahl der Kombinationen berechnen. Wie aber kann ich mögliche Kombinationen auslisten?</p>
<p>Danke<br />
Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204404</guid><dc:creator><![CDATA[StefanBB]]></dc:creator><pubDate>Sun, 22 Apr 2012 11:21:02 GMT</pubDate></item><item><title><![CDATA[Reply to Kombinationsmöglichkeiten on Sun, 22 Apr 2012 11:30:12 GMT]]></title><description><![CDATA[<p>Wenn ich dich jetzt nicht falsch verstanden habe, suchst du nach Permutationen.<br />
<a href="http://de.wikipedia.org/wiki/Permutation" rel="nofollow">http://de.wikipedia.org/wiki/Permutation</a></p>
<p>gruß syntax</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204407</guid><dc:creator><![CDATA[Syntax_error]]></dc:creator><pubDate>Sun, 22 Apr 2012 11:30:12 GMT</pubDate></item><item><title><![CDATA[Reply to Kombinationsmöglichkeiten on Sun, 22 Apr 2012 11:43:09 GMT]]></title><description><![CDATA[<p>Danke für Deine Antwort.</p>
<p>Permutation ist nicht was ich suche. Permutation wäre folgendes:</p>
<p>a,b,c<br />
b,c,a<br />
c,a,b<br />
b,c,a<br />
...</p>
<p>Ich suche aber eine Möglichkeit wie ich aus einer Liste z.B. {a,b,c,d,e} z.B. 3 Elemente rauspicke. Jetzt ist die Frage, welche Kombiantionsmöglichkeiten es gibt, wobei die Reihenfolge keine Rolle spielen soll:</p>
<p>also z.B.<br />
a,b,c<br />
a,c,d<br />
a,d,e<br />
...</p>
<p>abc und acb wäre z.B. das Gleiche.</p>
<p>Gibt es dafür Algorithmen?</p>
<p>Grüße<br />
Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204414</guid><dc:creator><![CDATA[StefanBB]]></dc:creator><pubDate>Sun, 22 Apr 2012 11:43:09 GMT</pubDate></item><item><title><![CDATA[Reply to Kombinationsmöglichkeiten on Sun, 22 Apr 2012 12:59:13 GMT]]></title><description><![CDATA[<p>Das ist im Grunde eine ziemlich simple Angelegenheit. Die Reihenfolge spielt keine Rolle, also suchst du die Menge aller aufsteigend sortierten Folgen einer bestimmten Länge.</p>
<p>Du fängst also an mit 123456 und fängst an hochzuzählen -</p>
<pre><code>1 2 3 4 5 6
1 2 3 4 5 7
1 2 3 4 5 8
...
1 2 3 4 5 49
</code></pre>
<p>...und wenn du beim höchsten Wert angekommen bist, übeträgst du auf die nächsthöhere Stelle und machst bei der kleinsten sortierten Folge, die dadurch definiert wird, weiter:</p>
<pre><code>1 2 3 4  5 49
1 2 3 4  6  7
1 2 3 4  6  8
...
1 2 3 4  6 49
1 2 3 4  7  8
...
1 2 3 4 48 49
1 2 3 5  6  7
...
</code></pre>
<p>bis du bei der letzten (44 45 46 47 48 49) angekommen bist.</p>
<p>Das kann man auf eine Menge verschiedener Arten machen. Verschachtelte Schleifen, Rekursion, oder in einer Schleife mit einem Array direkt so, wie ich es gerade beschrieben habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204440</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sun, 22 Apr 2012 12:59:13 GMT</pubDate></item><item><title><![CDATA[Reply to Kombinationsmöglichkeiten on Mon, 23 Apr 2012 11:02:08 GMT]]></title><description><![CDATA[<p>Es gibt die Funktion <code>next_permutation</code> in der STL, wirf da mal einen Blick drauf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204818</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Mon, 23 Apr 2012 11:02:08 GMT</pubDate></item><item><title><![CDATA[Reply to Kombinationsmöglichkeiten on Tue, 24 Apr 2012 09:42:53 GMT]]></title><description><![CDATA[<p>DocShoe schrieb:</p>
<blockquote>
<p>Es gibt die Funktion <code>next_permutation</code> in der STL, wirf da mal einen Blick drauf.</p>
</blockquote>
<p>die erfüllt aber nicht die anforderungen (zum lottozahlen ziehen kann man sie relativ schlecht gebrauchen ;))<br />
ich hab mich mal dran versucht. ist zwar relativ einfach zu benutzen, aber vrmtl so doof geschrieben, dass der compiler vieles nicht wegoptimieren kann. habs jetzt gerad mal gemessen. war dann aber zu faul, noch zu gucken, was man verbessern müsste, weil ich froh war, als es endlich lief^^ vermutlich aber vor allem, die zahlen in-place vertauschen. wollts aber auch mal so versuchen.<br />
nur zum lotto zahlen durchprobieren läuft es schon 34sec bei höchster optimierungsstufe@msvc / core2duo E8400@3.0GHz:</p>
<pre><code class="language-cpp">#pragma once

#pragma warning(push)
#pragma warning(disable:4996)

#include &lt;algorithm&gt;
#include &lt;cassert&gt;
#include &lt;iterator&gt;
#include &lt;ostream&gt;

template &lt;class T, class S = typename T::size_type&gt;
class sorted_selection
{
public:
	typedef typename T::value_type           value_type;
	typedef typename T::const_iterator  const_iter_type;
	typedef          S                        size_type;

	static sorted_selection make(const T&amp; set, size_type count)
	{
		return sorted_selection(set, count);
	}
	static sorted_selection end()
	{
		return sorted_selection();
	}

	sorted_selection(const sorted_selection&amp; rhs)
	:	set_(rhs.set_), count_(rhs.count_)
	{
		elements_ = nullptr;
		if(count_ == size_type(0))
			return;

		elements_ = new const_iter_type[count_];
		std::copy(rhs.elements_, rhs.elements_+count_, elements_);
	}
	~sorted_selection()
	{
		delete[] elements_;
	}
	sorted_selection&amp; operator=(const sorted_selection&amp; rhs)
	{
		sorted_selection(rhs).swap(*this);
		return *this;
	}
	void swap(sorted_selection&amp; rhs)
	{
		using std::swap;

		swap(set_, rhs.set_);
		swap(count_, rhs.count_);
		swap(elements_, rhs.elements_);
	}
	std::ostream&amp; operator&lt;&lt;(std::ostream&amp; s) const
	{
		assert(!is_end());

		for(auto i(elements_), e(elements_+count_); i != e; ++i)
			s &lt;&lt; **i &lt;&lt; ' ';
		return s;
	}
	bool is_end() const
	{
		return elements_ == nullptr;
	}

	sorted_selection next()
	{
		if(is_last())
			return end();

		sorted_selection ret_val(*this);
		ret_val.set_to_next();
		return ret_val;
	}

private:
	T const* set_;
	size_type count_;
	const_iter_type* elements_;

	sorted_selection()
	:	set_(nullptr), count_(0), elements_(nullptr)
	{}
	sorted_selection(const T&amp; set, size_type count)
	:	set_(&amp;set), count_(count), elements_(new const_iter_type[count_])
	{
		assert(set.size() &gt;= count_ &amp;&amp; count_ &gt; 0);

		const_iter_type first = set_-&gt;begin();
		for(size_type i(0); i != count_; ++i, ++first)
			elements_[i] = first;
	}

	void set_to_next()
	{
		for(size_type i(count_); i != 0; --i)
		{
			if(position_less_than_max(i-1))
			{
				add_one_to_pos(i-1);
				return;
			}

			for(; position_got_maximum(i-1); --i)
				/* skip all max states - no need to test for index bounds*/;

			//         v----- (i-1)
			// ... 23 24 98 99 {max = 99}

			auto&amp; pos_before_max_state = elements_[i-1];
			++pos_before_max_state;

			for(size_type j(i); j != count_; ++j)
			{
				//(j-1)----v
				// ... 23 25 98 99 {max = 99}
				//            ^---- (j)

				elements_[j] = elements_[j-1];
				++elements_[j];
			}
			// ... 23 25 26 27 {max = 99}
			return;
		}
	}
	bool position_less_than_max(size_type at) const
	{
		auto&amp; selection_position = elements_[at];
		auto&amp; max_set_position_for_selection_position = get_set_iter(set_-&gt;size()-count_+at);

		return selection_position != max_set_position_for_selection_position;
	}
	bool position_got_maximum(size_type at) const
	{
		return !position_less_than_max(at);
	}
	void add_one_to_pos(size_type at)
	{
		auto&amp; selection_position = elements_[at];
		++selection_position;
	}

	const_iter_type get_set_iter(size_type at) const
	{
		const_iter_type first = set_-&gt;begin();
		using std::advance;
		advance(first, at);
		return first;
	}
	bool is_last() const
	{
		assert(!is_end());

		auto first_selected = get_set_iter(set_-&gt;size()-count_);
		auto largest_available_state = elements_[0];
		return first_selected == largest_available_state;
	}
};

template &lt;class T, class S&gt;
std::ostream&amp; operator&lt;&lt;(std::ostream&amp; s, const sorted_selection&lt;T, S&gt;&amp; these)
{
	return these.operator&lt;&lt;(s);
}

template &lt;class T, class S&gt;
void swap(sorted_selection&lt;T, S&gt;&amp; lhs, sorted_selection&lt;T, S&gt;&amp; rhs)
{
	lhs.swap(rhs);
}

#pragma warning(pop)
</code></pre>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;

int main()
{
	const int min =  1;
	const int max = 49;
	const int pool_size = 7;

	std::vector&lt;int&gt; pool;
	for(int i(min), e(max+1); i != e; ++i)
		pool.push_back(i);

	timer_t time;
	unsigned long long count = 0;
	for(auto selection = sorted_selection&lt;std::vector&lt;int&gt;&gt;::make(pool, pool_size); !selection.is_end(); selection = selection.next())
		++count;
	time.stop();
	std::cout &lt;&lt; time.get_seconds() &lt;&lt; &quot; sec / &quot; &lt;&lt; count &lt;&lt; std::endl;
}
</code></pre>
<p>+ timer:</p>
<pre><code class="language-cpp">#pragma once

#include &quot;windows.h&quot; 

#include &lt;cassert&gt; 
#include &lt;stdexcept&gt; 

struct large_integer_t 
{ 
    typedef __int64 integral_type; 
    operator float() const 
    { 
        return static_cast&lt;float&gt;( static_cast&lt;integral_type&gt;(*this) ); 
    } 

    operator integral_type() const 
    { 
        return data.QuadPart; 
    } 
    operator integral_type() 
    { 
        return data.QuadPart; 
    } 

    large_integer_t() 
    :    data(LARGE_INTEGER()) 
    {} 

    large_integer_t(const LARGE_INTEGER&amp; data) 
    :    data(data) 
    {} 

    large_integer_t&amp; operator-= (const large_integer_t&amp; other) 
    { 
        data.QuadPart -= other.data.QuadPart; 
        return *this; 
    } 
private: 
    LARGE_INTEGER data; 
}; 

large_integer_t operator- (const large_integer_t&amp; lhs, const large_integer_t&amp; rhs)
 { 
    large_integer_t tmp(lhs); 
    tmp -= rhs; 
    return tmp; 
} 

class timer_t 
{ 
public: 
    typedef float second_t; 

    timer_t() 
    :    begin(get_timestamp()) 
#if !defined (NDEBUG) 
    ,    stopped(false) 
#endif //#if !defined (_NDEBUG) 
    { 
        end = begin; 
    } 

    void stop() 
    { 
#if !defined (NDEBUG) 
        stopped = true; 
#endif //#if !defined (_NDEBUG) 

        end = get_timestamp(); 
    } 

    second_t get_seconds() const 
    { 
        assert(stopped); 

        return (end-begin)/static_cast&lt;second_t&gt;(get_frequency()); 
    } 

private: 
#if !defined (NDEBUG) 
    bool stopped; 
#endif //#if !defined (_NDEBUG) 

    static large_integer_t get_frequency() 
    { 
        LARGE_INTEGER ret_val; 
        BOOL succeed = QueryPerformanceFrequency(&amp;ret_val); 

        if(!succeed) 
            throw std::runtime_error(&quot;calling QueryPerformanceFrequency failed&quot;);

        return ret_val; 
    } 

    static large_integer_t get_timestamp() 
    { 
        LARGE_INTEGER ret_val; 
        BOOL succeed = QueryPerformanceCounter(&amp;ret_val); 

        if(!succeed) 
            throw std::runtime_error(&quot;calling QueryPerformanceCounter failed&quot;); 

        return ret_val; 
    } 

    large_integer_t begin; 
    large_integer_t end; 
};
</code></pre>
<p>bb</p>
<p>edit: ok: inplace bringts doch ne ganze menge <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<pre><code class="language-cpp">void next_inplace()
	{
		if(is_last())
			*this = end();

		set_to_next();
	}
</code></pre>
<p>&lt;1sec</p>
<pre><code class="language-cpp">const int max = 65;
	const int pool_size = 8;
</code></pre>
<p>&lt;50sec</p>
<p>außerdem muss das array nicht vorsortiert sein, sondern man kann wahrscheinlichere zahlen/buchstaben vorn ranschreiben. schöner kann ichs jetzt aber nicht mehr reden^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2205174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2205174</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 24 Apr 2012 09:42:53 GMT</pubDate></item></channel></rss>