2017-03-07 35 views
0

我正在編寫一個遊戲,其中包括執行一個函數,該函數從列表中隨機選取一個人,並從其他列表中選擇一個隨機主題。更換示例,避免重複

的主要原則是: - 您可以運行的代碼,你希望所有的時間,但代碼不能給出2次同一個人

就目前我所得到的是:

# Lists 
people = list('john','peter','alex') 
topic = list('Finance','Ensurance','Retail') 

Start<-function(people, topic){ 
    arg1 = sample(people,1) 
    arg2 = sample(topic,1) 
    return (list(arg1,arg2)) 
} 

問題的癥結在於:確保每次運行「開始」功能時,人員p和p + 1都不相同。所以,結果可能是這樣的:

約翰,金融/彼得,金融/約翰,零售/亞歷克斯,金融 但從來沒有:約翰,金融/約翰,金融。

+0

你的意思是說他們永遠不能再被選中,或者連續兩次都不會被選中? –

+0

你的要求到底是什麼還不清楚。您可以存儲先前的繪圖。或者你可以在開始時每個列表使用'sample'來洗牌,然後跟蹤並增加當前的索引。所以我假設'Start()'只能被調用三次? – MrFlick

+0

我的意思是,這個遊戲可能會隨機選擇一個人寫一個話題到博客中(例如),所以話題可以重複,但不是人。 – PeCaDe

回答

3

我可能會做一個生成風格功能

people <- c('john','peter','alex') 
topic <- c('Finance','Ensurance','Retail') 

Starter <- function(people, topic){ 
    last.person <- "" 
    function() { 
    next.person <- sample(setdiff(people, last.person), 1) 
    next.topic <- sample(topic,1) 
    last.person <<- next.person 
    return(list(next.person, next.topic)) 
    } 
} 

s <- Starter(people, topic) 
s() 
s() 
s() 

這裏Starter()返回,你可以打電話獲得一個新樣本的功能。它跟蹤最後選擇的人並將其排除在可能的抽籤名單中。請注意,我使用簡單的向量列表選項而不是列表來簡化操作。

+0

就是這樣!我想通過循環,但你的代碼更短,智能的解決方案! – PeCaDe