2015-01-06 3 views
-3

저는 100 개의 항목을 여러 개의 제약 조건이있는 5 가지 유형 (바나나, 사과, 포도, 쇠고기, 돼지 고기)으로 순서를 바꿀 수있는 코드를 작성하는 데 어려움을 겪었습니다. 규칙.Python을 사용하여 여러 제약 조건을 가진 목록의 순서를 바 꾸었습니다

바나나, 사과, 포도가 각각 30 회 (총 90 회) 출현하고 쇠고기와 돼지 고기는 각각 5 회 (총 10 회) 출현합니다. 내가 셔플 과정에 통합 할

제약은 다음과 같습니다

  1. 고기 품목 (쇠고기 또는 돼지 고기) 만 (과일 항목 후 (1 ~ 100) 순서에 바나나 나타나는 시작합니다, 사과, 포도)는 5 ~ 10 회 제공됩니다.

  2. 고기 항목 사이에 "적어도"3 개의 과일 아이템이 있어야합니다.

누구든지 나에게 이러한 코드를 프로그래밍 할 수 있다면 정말 감사하겠습니다.

+0

스택 오버플로에 오신 것을 환영합니다! 우리가 당신을 위해 몇 가지 코드를 작성하기를 원하는 것처럼 보입니다. 대부분의 사용자는 곤경에 처한 코더 코드를 기꺼이 만들지 만 일반적으로 포스터가 이미 문제를 해결하려고 시도했을 때만 도움이됩니다. 이러한 노력을 입증하는 좋은 방법은 지금까지 작성한 코드, 예제 입력 (있는 경우), 예상 출력 및 실제로 얻은 출력 (콘솔 출력, 스택 추적, 컴파일러 오류 등)을 포함시키는 것입니다. 응용할 수 있는). 더 자세하게 제공할수록 더 많은 답변을받을 수 있습니다. –

+2

저는 카운터를 유지하고 아이템이 생성 될 때 확률을 조정하는 발전기 방식을 사용합니다. 따라서 적어도 5 가지 과일 아이템이 생산 될 때까지 육류 아이템 확률은 0이며, 그 후에 확률을 높일 수 있습니다. 육류 제품을 생산할 때마다 또 다른 3 개의 과일 등을 생산할 때까지 확률은 다시 0으로 떨어집니다. –

+0

"과일 품목 (바나나, 사과, 포도)을 5 ~ 10 회 제공 한 후"를 명확히 할 수 있습니까? – Joel

답변

1

여기에 고기 사이의 정확한 간격을 보장하는 옵션이 있습니다. 그것은 각 고기 쌍 사이에 정확히 3 과일과 요구 사항을 충족 목록을 생성합니다. 그런 다음 무작위로 더 많은 과일을 삽입합니다.

import random 

meat = ['pork', 'beef']*5 
fruit = ['grape', 'banana', 'apple']*30 
random.shuffle(meat) 
random.shuffle(fruit) 

result = fruit[-5:] 
del fruit[-5:] 

result.append(meat.pop()) 
while meat: 
    result.extend(fruit[-3:]) 
    del fruit[-3:] 
    result.append(meat.pop()) 

resultlength = len(result) 
while fruit: 
    insertion_location = random.randint(0,resultlength) 
    result.insert(insertion_location,fruit.pop()) 
    resultlength += 1 


print result 

[ '포도', '포도', '포도', '포도', '바나나', '포도', '바나나', '사과', '바나나', '사과' , 'banana', 'apple', 'grape', 'banana', '쇠고기', '사과', '포도', '포도', '포도', '사과' '사과', '사과', '사과', '사과', '쇠고기', '사과', '바나나', '포도', '바나나', '사과', '포도' '포도', 포도 '사과'포도 '사과'사과 '사과'바나나 ' '돼지 고기 ','바나나 ','바나나 ','바나나 ' '포도', '돼지 고기', '바나나', '사과', '바나나', '사과', '사과', '포도', '바' 포도 나무 ','포도 ', '돼지 고기 ','사과 ','포도 ','사과 ','사과 ','사과 ' 바나나 ','바나나 ','포도 ','바나나 ', '바나나 ','포도 ','사과 ','돼지 고기 ''사과 ''포도 ''포도 ' ' 포도 ","포도 ","포도 ","바나나 ","쇠고기 ", '사과', '바나나', '사과', '바나나', '포도', '바나나' ' '사과 ','쇠고기 ','바나나 ','사과 ','포도 ','사과 ','바나나 ', '쇠고기 ','사과 ']

통지하는 경우가있다 과일의 길이가 길어지면, 다른 과일이 들어갈 확률이 높아집니다. 그것이 바람직한지 확실하지 않습니다. 그렇지 않다면 [5 과일], [3 과일], [3 과일] 등의 하위 목록을 만든 다음 무작위로 더 많은 과일을 삽입 할 수 있습니다. 그런 다음 그들 사이에 나타나는 고기와 함께 모두 합치십시오. 선호하는 결과의 최종 배포가 정확히 무엇인지 명확하지 않습니다.

+0

@MartijnPieters 정확하게 3을 수행 한 다음 통과하여 무작위로 더 삽입합니다 (가능하면 간격을 3보다 길게 연장 할 수도 있음). – Joel

+0

오른쪽, 목록을 구성하고 확장하십시오. 나는 초기 과일 5 개로 시작하겠다. 10. –

+0

@MartijnPieters'list' ->'result' done, 시작시 단지 5 과일까지.또한 '고기'가 터지도록 변경하여 '고기'가 끝날 수있게했습니다. – Joel

1

가변 확률의 생성기를 사용하십시오. 두 목록으로 과일과 고기를 섞은 것과 선택,하지만 당신은에서 선택하는 빈도의 확률을 조정하거나 지금까지 제작 된 내용을 기반으로 :

import random 

def food_mix(): 
    fruits = ['apple', 'banana', 'grape'] * 30 
    meats = ['beef', 'pork'] * 5 
    random.shuffle(fruits) 
    random.shuffle(meats) 
    meat_prob = 0 
    fruit_count = 0 
    first_meat = False 
    while fruits or meats: 
     if not meats or not fruits: 
      # yield remainders 
      yield meats.pop() if meats else fruits.pop() 
      continue 
     if random.random() < meat_prob: 
      yield meats.pop() 
      first_meat = True 
      meat_prob = fruit_count = 0 
     else: 
      yield fruits.pop() 
      fruit_count += 1 
      if (first_meat and fruit_count > 3) or fruit_count > 5: 
       # allow meat again 
       if first_meat: 
        meat_prob = 1.0/10.0 # one in 10 chance of meat 
       else: 
        meat_prob = 100.0/(95.0 - fruit_count) # scale based on amount of fruit 

을이 항상 과일과 고기 같은 수의 생산 그러나 귀하의 제약 조건에 따라 무작위 순서로 배열하십시오 :

>>> len(list(food_mix())) 
100 
>>> list(food_mix()).count('beef') 
5 
>>> list(food_mix()).count('pork') 
5 
>>> list(food_mix()).count('apple') 
30 
>>> list(food_mix()).count('banana') 
30 
>>> list(food_mix()).count('grape') 
30 
>>> list(food_mix()) 
['grape', 'banana', 'banana', 'banana', 'apple', 'apple', 'beef', 'banana', 'banana', 'banana', 'grape', 'grape', 'apple', 'apple', 'apple', 'banana', 'grape', 'apple', 'grape', 'grape', 'grape', 'banana', 'grape', 'banana', 'grape', 'banana', 'grape', 'banana', 'beef', 'apple', 'apple', 'apple', 'banana', 'apple', 'banana', 'apple', 'banana', 'apple', 'grape', 'beef', 'apple', 'apple', 'apple', 'banana', 'grape', 'pork', 'banana', 'grape', 'grape', 'apple', 'grape', 'grape', 'apple', 'apple', 'grape', 'apple', 'grape', 'grape', 'banana', 'grape', 'apple', 'grape', 'banana', 'apple', 'banana', 'grape', 'banana', 'grape', 'apple', 'apple', 'banana', 'banana', 'banana', 'grape', 'pork', 'grape', 'apple', 'banana', 'banana', 'grape', 'banana', 'grape', 'grape', 'apple', 'banana', 'pork', 'apple', 'apple', 'grape', 'apple', 'banana', 'banana', 'banana', 'apple', 'beef', 'apple', 'grape', 'pork', 'pork', 'beef'] 

고기는 위쪽으로 생성 된 변경 사항을 조정할 수 있습니다. 현재의 확률은 그 끝에있는 고기를 모으는 경향이 있습니다.

fruits 목록의 크기와 함께 표시되는 확률을 조정하여 과일이 부족할 때 육류 제품이 생산 될 확률을 높일 수 있습니다.

+0

이 코드의 끝에 2 개의 고기가 남을 위험이 있습니까? – Joel

+0

@Joel : 네, 그런 위험이 있습니다. 항상 임의성이 있습니다. 아마도 '과일'의 크기에 따라 확률을 높이는 식으로 고기를 잡아서 피할 수 있습니다. –

+0

약초를 먹을 수 있습니다. (미안, 시도해야했다 - 나의 아내와 우리 2 살의 삼투압에 의한 네덜란드어 배우기) – Joel